编译好:
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
?
答案 0 :(得分:2)
虽然willSet
和didSet
出现在属性后面的括号中,但类似于计算方法get
和set
,它们并不是指计算属性行为。 willSet
和didSet
对存储的属性起作用。这也是您可以为它们提供默认值的原因,但不是get/set
:
var a: Int = 6 { // this line would not compile for a computed property
willSet {
}
didSet {
print(oldValue)
}
}
这是init
中编译器错误的原因 - 没有初始化存储的属性。