我有一个lazy变量声明如下:
private lazy var cachedTonesByChord: [Note: [Note]] = self.tonesByChord()
...其中self.tonesByChord()
有以下签名:
() -> [Note: [Note]]
现在,当我删除类型:
private lazy var cachedTonesByChord = self.tonesByChord()
...编译抱怨:
使用未解析的标识符'self'
为什么编译器不能自动推断出类型?
答案 0 :(得分:0)
来自The Swift Programming Language:
如果存储属性的默认值需要某些自定义或设置,则可以使用闭包或全局函数为该属性提供自定义的默认值。每当初始化属性所属类型的新实例时,都会调用闭包或函数,并将其返回值指定为属性的默认值。
您希望使用实例方法来设置属性的值,而不是全局函数,但这是不可能的,因为
如果使用闭包来初始化属性,请记住在执行闭包时尚未初始化实例的其余部分。这意味着您无法从闭包中访问任何其他属性值,即使这些属性具有默认值也是如此。您也不能使用隐式self属性,也不能调用任何实例的方法。
所以,这里的问题是你在自己调用一个方法。
<强>更新强>
在第二个想法,这似乎很奇怪,因为你已经声明了一个lazy
属性,它将在你的实例已经存在时创建。
答案 1 :(得分:0)
因为您的子类可以使用不同的返回类型实现tonesByChord()
。
例如:
class Chord {
private lazy var cachedTonesByChord = self.tonesByChord()
func tonesByChord() -> [Note:[Note]] {
return [Note("C") : [Note("C"), Note("E")]]
}
}
class ChordSub:Chord {
func tonesByChord() -> [Note] {
return [Note("A"), Note("B")]
}
}
如果类为ChordSub
,则编译器无法确定在没有明确类型要求的情况下应调用哪个tonesByChord()
。