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

属性 – Swift属性覆盖不起作用,第1张

概述当我尝试覆盖一个属性我得到一个错误“不能覆盖只读属性的可变属性” 我已经提供了get和set在超级类. class Card { var contents:String { get { return self.contents } set { self.contents = newValue 当我尝试覆盖一个属性我得到一个错误“不能覆盖只读属性的可变属性”

我已经提供了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而不是将其初始化为空字符串的好候选者.

总结

以上是内存溢出为你收集整理的属性 – Swift属性覆盖不起作用全部内容,希望文章能够帮你解决属性 – Swift属性覆盖不起作用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1027268.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-23
下一篇2022-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存