'self' captured by a closure before all members were initialized 2018-03-17

场景

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 closure before all members were initialized 2018-03-17)