该错误信息的原因是nil-coalescing运算符定义为
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
self.value = dict["bar"] as? String ?? _defaultValue
由编译器转换为
self.value = dict["bar"] as? String ?? { self._defaultValue }()
编译器在这里抱怨,因为self
在完全初始化之前就被捕获了。(错误消息在Swift 2和Swift 3之间略有不同)。
init(dict: NSDictionary){
let defValue = _defaultValue
self.value = dict["bar"] as? String! ?? defValue
}
或者,您可以将其设为该类的静态属性:
class Foo {
static let _defaultValue = "N/A"
let value: String
init(dict: NSDictionary) {
self.value = dict["bar"] as? String ?? Foo._defaultValue
}
}
或替换??
为if语句:
class Foo {
let _defaultValue = "N/A"
let value: String
init (dict: NSDictionary) {
if let value = dict["bar"] as? String {
self.value = value
} else {
self.value = _defaultValue
}
}
}
附录: 相关资源:
引用错误报告:
Jordan Rose:这是正确的,因为&&是使用@autoclosure实现的,但是肯定不是最优的。