为什么/ didSet会触发初始化程序错误,而不是常规的set / get?

时间:2017-06-11 18:01:22

标签: swift

编译好:

class Foo {
    var number = 0
    var name: String
    init(name: String){ self.name = name }
}

class SubFoo: Foo {
    init(_ x: Int){
        super.init(name: "abc")

    }

    var a: Int {
        set {}
        get {
            return 0
        }
    }
}

a是计算属性,因此不需要初始化。

但是这不能编译:

class SubFoo: Foo {
    init(_ x: Int){
        super.init(name: "abc")

    }

    var a: Int {
        willSet {}
        didSet {
            print(oldValue)
        }
    }
}

SubFoo init方法显示:

  

错误:属性'self.a'未在super.init调用时初始化           super.init(名称:“sdf”)

a仍然不是“真正的”属性,那么编译器究竟在期待什么呢?

奇怪的是,我可以通过这样做来消除错误:

init(_ x: Int){
    a=0
    super.init(name: "sdf")

}

为什么a=0需要willSet而{1}}不是set

1 个答案:

答案 0 :(得分:2)

虽然willSetdidSet出现在属性后面的括号中,但类似于计算方法getset,它们并不是指计算属性行为。 willSetdidSet对存储的属性起作用。这也是您可以为它们提供默认值的原因,但不是get/set

   var a: Int = 6 { // this line would not compile for a computed property
        willSet {
        }
        didSet {
            print(oldValue)
        }
    }

这是init中编译器错误的原因 - 没有初始化存储的属性。