我有一个带有两个初始化器的类,第一个类似于
init?(){
if ..... { return nil }
// attributes initialization
}
,第二个是调用第一个的便捷初始化器,但是我想检测第一个初始化器是否返回nil,否则我不会继续使用我的代码。我尝试过类似下面的代码,但它对我不起作用。
convenience init?(value: Int) {
if let myObject = self.init() {
return nil
}
self.value = value
}
我也尝试将它直接分配给变量,但看起来编译器不喜欢它。有没有办法检测它而不添加布尔属性?
答案 0 :(得分:5)
如果您委托给另一个初始化程序,则无法检测到失败。来自文件:Propagation of Initialization Failure
在任何一种情况下,如果您委托另一个导致初始化失败的初始化程序,整个初始化过程会立即失败,并且不会执行进一步的初始化代码。
如果您只想在失败时返回nil
,请将其保留。
class Foo {
var name:String
var x = 1
init?(name:String) {
self.name = name
if name == "" {
return nil
}
}
convenience init?(name:String, x:Int) {
self.init(name:name)
// Not executed if self.init(name:) failed.
self.x = x
}
}
Foo(name: "", x:12) // -> nil
Foo(name: "foo", x:42) // -> {name:"foo" x:42}