输入惰性变量的推断

时间:2014-10-20 09:18:12

标签: swift

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

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

...其中self.tonesByChord()有以下签名:

() -> [Note: [Note]]

现在,当我删除类型:

private lazy var cachedTonesByChord = self.tonesByChord()

...编译抱怨:

  

使用未解析的标识符'self'

为什么编译器不能自动推断出类型?

2 个答案:

答案 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()