当我尝试覆盖一个属性我得到一个错误“不能覆盖只读属性的可变属性”
我已经提供了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而不是将其初始化为空字符串的好候选者.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。