覆盖实例变量的默认值

标签 overriding swift default-value instance-variables subclassing

给定类 Obj,

class Obj: NSObject {
    var x = "x"
}

及其子类Obj1,如何更改var x的默认值?

简单地设置一个新值最有意义,但它似乎出错了......

class Obj1: Obj {
    var x = "y"
}

❗️ Cannot override with a stored property 'x'

最佳答案

在大多数情况下,通过 init 注入(inject)这些值是首选方式。

例如:

class Foo
{
    var x : String

    convenience init()
    {
        self.init(x: "x")  // 'x' by default
    }

    init(x: String)
    {
        self.x = x
    }
}

class Bar : Foo
{
    convenience init()
    {
        self.init(x: "y")   // now 'y' by default
    }

    init(x: String)
    {
        super.init(x: x)
    }
}

但是,在某些情况下,您想要覆盖计算属性或可能未完全初始化的属性。

在这种情况下,您可以使用override var 语法:

override var x : String
{
    get { return super.x }      // get super.x value
    set { super.x = newValue }  // set super.x value
}

上面的代码并没有改变行为,而是说明了允许你这样做的语法。

关于覆盖实例变量的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24122913/

相关文章:

c++ - 在 C++98、C++11 交叉编译代码中处理重写的优雅方法?

php - 如何在 wordpress 中的 fonts.php 之后加载 style.css?

swift - 通过偏移量获取元素到序列中

iphone - 我的应用程序仅请求推送通知权限,但不请求位置。我该如何解决这个问题?

postgresql - 为什么具有默认值的非空 postgres 列会引发约束错误?

mysql - 我认为 curtime()、now() 和 current_timestamp 是 MySql 中有效的默认日期时间值?

C++ 编译器 (cl) 看不到具有相同子方法名称的父虚方法

java - 访问android中重写方法的参数的子方法?

ios - App Tracking Transparency 如何影响显示广告的应用程序? - IDFA iOS14

Swift - 如何初始化 NSDate 属性的默认值?