我有一个懒变量声明如下:

private lazy var cachedTonesByChord: [Note: [Note]] = self.tonesByChord()

…其中self.tonesByChord()具有以下签名:
() -> [Note: [Note]]

现在,当我删除类型时:
private lazy var cachedTonesByChord = self.tonesByChord()

…编译器抱怨:
使用未解析的标识符“self”
为什么编译器不能自动推断类型?

最佳答案

The Swift Programming Language:
如果存储的属性的默认值需要自定义或设置,则可以使用闭包或全局函数为该属性提供自定义的默认值。每当初始化属性所属类型的新实例时,将调用闭包或函数,并将其返回值指定为属性的默认值。
您希望使用实例方法来设置属性值,而不是使用全局函数,但这是不可能的,因为
如果使用闭包初始化属性,请记住,在执行闭包时,实例的其余部分尚未初始化。这意味着您不能从闭包中访问任何其他属性值,即使这些属性具有默认值。也不能使用隐式自身属性或调用实例的任何方法。
所以,这里的问题是你在调用self的方法。
更新
再考虑一下,这似乎很奇怪,因为您已经声明了一个lazy属性,它将在您的实例已经存在时创建。

10-08 12:15