Swift 2 / XCode 7 中惰性变量中的字符串文字 [无法转换字符串类型的值 ...]

String literals in lazy vars in Swift 2 / XCode 7 [Cannot convert value of type String ...]

每当字符串文字出现在 lazy var 的声明中时,我都会在 Swift 2 / XCode 7 中收到编译错误:Cannot convert value of type String to expected argument type '(_builtinStringLiteral: RawPointer, byteSize: Word, isASCII: Int1)' ...

(我在 Swift 1.2 / XCode 6 中没有问题)

产生此错误的最简单的行如下所示:

lazy var foo = "bar"

但更相关的是(恼人的),它也发生在接受字符串参数的初始化器中:

lazy var viewsLabel = HWLabel(color: COLOR_WHITE, font: ProximaNova("Semibold", 13))
lazy var durationIconView = HWIconView(imageName: "TimeIcon", color: COLOR_WHITE)

这些显然是我自己的初始化器,我注意到 Apple SDK 似乎并不经常将字符串作为初始化器中的参数。 init 中的字符串是不好的做法吗?

有效的方法是将声明包装在一个块中。

我现在可能会这样做,或者只是让它们不 lazy

不过我还是很好奇。这是 XCode 7 错误吗?

更新:

刚注意到起作用的是不是将声明包装在闭包中,而是指定 var 的类型,这样它就不会被推断出来。

所以,什么有效

lazy var viewsLabel: HWLabel = HWLabel(color: COLOR_WHITE, font: ProximaNova("Semibold", 13))
lazy var durationIconView: HWIconView = HWIconView(imageName: "TimeIcon", color: COLOR_WHITE)

为什么 lazy var 声明中字符串的出现会扰乱类型推断,这让我无法理解。仍然有一种预感,它可能是一个 XCode 7 错误。

这是一个错误,如果您添加它可以编译的 var 类型:

我在这里找到了答案: