在调用 super.init() 之前,无法在 init() 中放置 Swift 断言
Cannot place Swift assertions inside init() before call to super.init()
我想在调用 super.init()
之前在 init()
中使用断言。它们旨在在计算局部属性时检查某些不变条件。
但是,如果我尝试放置此类断言,我会收到此错误消息:
'self' used before super.init call
我假设这是因为 assert 打印了对象的描述,因此使用了 self
,此时尚未完全初始化。我能做些什么吗(即在调用 super.init()
之前计算本地属性并在那里放置断言)。
UPDATE 这是一个简明的例子:
class Test: NSObject {
let x: Int
override init() {
x = 1
assert(x == 1) // causes error
super.init()
assert(x == 1) // no error
}
}
原因是assert
必须读取属性x
的值。
虽然您可以省略 self
作为一种方便的语法 assert
使用 属性 的隐式 setter 并且必须调用 self.x == 1
。
错误消息就是这么说的。
您可以使用临时局部变量来计算您需要的内容,但您不能在调用之前使用实例变量super.init()
。
或者使用不需要调用 super.init()
的 struct
或 protocol
类型
我想在调用 super.init()
之前在 init()
中使用断言。它们旨在在计算局部属性时检查某些不变条件。
但是,如果我尝试放置此类断言,我会收到此错误消息:
'self' used before super.init call
我假设这是因为 assert 打印了对象的描述,因此使用了 self
,此时尚未完全初始化。我能做些什么吗(即在调用 super.init()
之前计算本地属性并在那里放置断言)。
UPDATE 这是一个简明的例子:
class Test: NSObject {
let x: Int
override init() {
x = 1
assert(x == 1) // causes error
super.init()
assert(x == 1) // no error
}
}
原因是assert
必须读取属性x
的值。
虽然您可以省略 self
作为一种方便的语法 assert
使用 属性 的隐式 setter 并且必须调用 self.x == 1
。
错误消息就是这么说的。
您可以使用临时局部变量来计算您需要的内容,但您不能在调用之前使用实例变量super.init()
。
或者使用不需要调用 super.init()
struct
或 protocol
类型