加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 导致’在初始化之前被闭包捕获的常量’错误的原因

发布时间:2020-12-14 04:50:39 所属栏目:百科 来源:网络整理
导读:在下面的课程 class Foo { let _defaultValue = "N/A" let value: String init (dict: NSDictionary) { self.value = dict["bar"] as? String! ?? _defaultValue }} 编译因消息而失败 在初始化之前由闭包捕获的常量’self.value’ 据我所知,没有运算符读取se
在下面的课程

class Foo {
   let _defaultValue = "N/A"
   let value: String 

   init (dict: NSDictionary) {
       self.value = dict["bar"] as? String! ?? _defaultValue
   }
}

编译因消息而失败
在初始化之前由闭包捕获的常量’self.value’

据我所知,没有运算符读取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
完全初始化. (错误消息略有不同
在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
        }
    }
}

附录:相关资源:

>在Swift论坛中的Autoclosure of self in initializers.
> SR-944 Cannot use ‘self’ in RHS of && before all properties are initialized错误报告.

从错误报告中引用:

Jordan Rose: This is true since && is implemented using @autoclosure,but it’s certainly suboptimal.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读