美文网首页
'self' captured by a clo

'self' captured by a clo

作者: 小白猿 | 来源:发表于2018-03-17 14:29 被阅读496次

    场景

    Swift,在一个模型中有两个布尔的属性,比如a和b,在init方法中用到了a && b 或者 a || b时会报以下错误
    'self' captured by a closure before all members were initialized
    百度谷歌都没有一个太准确的答案,后来抽象了一个简单的例子如下

    class ModelTest: NSObject {
        var a: Bool = false
        var b: Bool = true
        
        override init() {
            if a && b {
                
            }
        }
    }
    

    探索

    • 后来经过调试,出现错误会满足一个条件 --- 模型继承自NSObject
    • 我们知道在Swift中是类是可以不继承任何父类的,所以这也是解决方法之一
    • 但是有些必须要继承NSObject 的怎么办?答案是super.init()

    答疑

    在init方法中调用super.init()之前,要保证这个类或者说这个NSObject的子类的属性要全部初始化,所以刚才的简单的例子有两种修改方式,在具体的开发中根据具体的开发场景进行选择

    • init之前就赋初值
    • 在init方法内,在调用 super.init() 之前调用
    • 当然Swift还有一个特有的方法,就是使用可选值
    # init之前就赋初值
    class ModelTest: NSObject {
        var a: Bool = false
        var b: Bool = true
        
        override init() {
            super.init()
            if a && b {
            }
        }
    }
    
    # 在init方法内,在调用 super.init() 之前调用
    class ModelTest: NSObject {
        var a: Bool
        var b: Bool 
        
        override init() {
            a = true
            b = false
            super.init()
            if a && b {
            }
        }
    }
    
    # 可选值
    class ModelTest: NSObject {
        var a: Bool?
        var b: Bool?
        
        override init() {
            super.init()
            if a! && b! {
                
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:'self' captured by a clo

          本文链接:https://www.haomeiwen.com/subject/ecljqftx.html