属性 – Swift属性覆盖不起作用

当我尝试覆盖一个属性我得到一个错误“不能覆盖只读属性的可变属性

我已经提供了get和set在超级类.

class Card {
    var contents:String {
        get {
            return self.contents
        }
        set {
            self.contents = newValue
        }
    }
    init() {
        self.contents = ""
    }
}

这是我的子类,我试图覆盖“内容属性.

class PlayingCard: Card {
    override var contents:String { //<-- this is where I get the build error
        get {
            var rankStrings:Array<String> = PlayingCard.rankStrings()
            return rankStrings[Int(self.rank)] + self.suit
        }
    }
}

我究竟在做错什么?

如果你重写的属性既有一个getter和一个setter,你也需要在你的子类中同时提供这两个属性.这是 relevant part from the Swift language guide(强调我的):

You can present an inherited read-only property as a read-write
property by providing both a getter and a setter in your subclass
property override. You cannot,however,present an inherited
read-write property as a read-only property.

如果您没有对该值进行任何特殊操作,那么通常会将要设置的值传递给基类:

set {
    super.contents = newValue
}

你也可以用一个空的设置器丢弃这个值(虽然我不能想到一个很好的理由去做这个事情):

set { }

我还想指出,您的Card类中的内容属性中有一个无限循环.当你这样做:

get {
    return self.contents
}

你实际上只是再次呼唤同样的吸气者,创造一个无限循环;你正在和设定者一样. Swift不会自动像Objective-C那样为您的属性创建ivars,因此您需要自己创建它们.创建该属性的更合适的方法是执行以下操作:

class Card {
    private var _contents: String
    var contents: String {
        get {
            return _contents
        }
        set {
            _contents = newValue
        }
    }
    init() {
        _contents = ""
    }
}

但是,由于您没有在setter和getter中设置和返回_contents,因此您可以简化为:

class Card {
    var contents: String = ""
    init() {

    }
}

注意:内容也可能是使用可选(String?)并将其设置为nil而不是将其初始化为空字符串的好候选者.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...