检测是否是init?在另一个初始化程序中返回nil

时间:2015-03-12 11:08:55

标签: swift

我有一个带有两个初始化器的类,第一个类似于

init?(){
    if ..... { return nil }
    // attributes initialization
}

,第二个是调用第一个的便捷初始化器,但是我想检测第一个初始化器是否返回nil,否则我不会继续使用我的代码。我尝试过类似下面的代码,但它对我不起作用。

convenience init?(value: Int) {
    if let myObject = self.init() {
         return nil
    }
    self.value = value
}

我也尝试将它直接分配给变量,但看起来编译器不喜欢它。有没有办法检测它而不添加布尔属性?

1 个答案:

答案 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}