swift – 导致’在初始化之前被闭包捕获的常量’错误的原因
在下面的课程
class Foo { let _defaultValue = "N/A" let value: String init (dict: NSDictionary) { self.value = dict["bar"] as? String! ?? _defaultValue } } 编译因消息而失败 据我所知,没有运算符读取self.value,这个消息真的很混乱. 我随机发明的变通方法让我更加困惑: class Foo { let value: String init (dict: NSDictionary) { let _defaultValue = "N/A" self.value = dict["bar"] as? String! ?? _defaultValue } } 使_defaultValue声明并在构造函数中初始化关闭编译器抱怨并且程序正常工作! 怎么解释这样的事情? 解决方法
错误消息的原因是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 可能的解决方法.您可以先将属性分配给局部变量: 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 } } } 附录:相关资源: >在Swift论坛中的Autoclosure of self in initializers. 从错误报告中引用:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |