场景
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! {
}
}
}
网友评论