在下面的课程
class Foo {
let _defaultValue = "N/A"
let value: String
init (dict: NSDictionary) {
self.value = dict["bar"] as? String! ?? _defaultValue
}
}
Run Code Online (Sandbox Code Playgroud)
编译因消息而失败
constant 'self.value' captured by a closure before being initialized
据我所知,没有操作员阅读_defaultValue,这个消息真的令人困惑.
我随机发明的变通方法让我更加困惑:
class Foo {
let value: String
init (dict: NSDictionary) {
let _defaultValue = "N/A"
self.value = dict["bar"] as? String! ?? _defaultValue
}
}
Run Code Online (Sandbox Code Playgroud)
决策constant 'self.value' captured by a closure before being initialized声明和初始化内部构造关闭编译器抱怨和编程工作!
怎么解释这样的事情?
Mar*_*n R 14
错误消息的原因是nil-coalescing运算符被定义为
public func ??<T>(optional: T?, defaultValue: @autoclosure () throws -> T) rethrows -> T
Run Code Online (Sandbox Code Playgroud)
并在第二个参数上执行"自动关闭"(以获得短路行为).所以
self.value = dict["bar"] as? String ?? _defaultValue
Run Code Online (Sandbox Code Playgroud)
由编译器转换为
self.value = dict["bar"] as? String ?? { self._defaultValue }()
Run Code Online (Sandbox Code Playgroud)
这里编译器抱怨因为self在完全初始化之前被捕获.(Swift 2和Swift 3之间的错误消息略有不同).
可能的解决方法.您可以先将属性分配给局部变量:
init(dict: NSDictionary){
let defValue = _defaultValue
self.value = dict["bar"] as? String! ?? defValue
}
Run Code Online (Sandbox Code Playgroud)
或者你可以使它成为类的静态属性:
class Foo {
static let _defaultValue = "N/A"
let value: String
init(dict: NSDictionary) {
self.value = dict["bar"] as? String ?? Foo._defaultValue
}
}
Run Code Online (Sandbox Code Playgroud)
或者用??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
}
}
}
Run Code Online (Sandbox Code Playgroud)
附录:相关资源:
从错误报告中引用:
Jordan Rose:这是真的,因为&&是使用@autoclosure实现的,但它肯定不是最理想的.
| 归档时间: |
|
| 查看次数: |
2789 次 |
| 最近记录: |