在调用super.init()之前,无法在init()内放置Swift断言

在调用super.init()之前,无法在init()内放置Swift断言,swift,assert,init,swift2,Swift,Assert,Init,Swift2,在调用super.init()之前,我想在init()中使用断言。它们用于在计算局部属性时检查某些不变条件 但是,如果我尝试放置此类断言,则会收到以下错误消息: 在super.init调用之前使用的“self” 我假设这是因为assert打印对象的描述,因此使用self,此时还没有完全初始化。对此我能做些什么(例如,在调用super.init()之前计算本地属性,并在那里放置断言) 更新以下是一个简明示例: class Test: NSObject { let x: Int o

在调用
super.init()
之前,我想在
init()中使用断言。它们用于在计算局部属性时检查某些不变条件

但是,如果我尝试放置此类断言,则会收到以下错误消息:

在super.init调用之前使用的“self”

我假设这是因为assert打印对象的描述,因此使用
self
,此时还没有完全初始化。对此我能做些什么(例如,在调用
super.init()
之前计算本地属性,并在那里放置断言)

更新以下是一个简明示例:

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
类型显示一些代码您正在尝试执行的操作。。。同时,阅读并了解所有备选方案/方法…@robertvojta我添加了一个示例(带有琐碎的初始化逻辑)。