当我的便利初始化程序在if.-let语句中运行self.init时,为什么Swift会给我一个编译器错误?

时间:2015-10-13 15:45:15

标签: swift

以下是我想要编译的代码示例:

class Fruit {
    var name: String

    init(name: String, season: String) {
        self.name = name
    }

    convenience init?(data: [String: String]) {
        if let name = data["name"], region = data["region"] {
            self.init(name: name, season: region)
        }
    }
}

编译器错误是“在调用self.init之前委托初始化程序时使用'self'”

如果初始化程序是可用的,我不应该有能够运行任何初始化程序的代码路径吗?如果您使用初始化程序添加else,则此代码将编译:

convenience init?(data: [String: String]) {
    if let name = data["name"], region = data["region"] {
        self.init(name: name, season: region)
    } else {
        self.init(name: "test", season: "test")
    }
}

1 个答案:

答案 0 :(得分:1)

错误消息可能会产生误导。如果初始化失败,则必须显式返回nil,如中所述 文档"Failable Initializers"

  

您在可用的初始化程序中编写return nil以指示一个点   可以触发初始化失败。

在您的情况下,您必须添加其他案例 如果可选绑定失败:

convenience init?(data: [String: String]) {
    if let name = data["name"], region = data["region"] {
        self.init(name: name, season: region)
    } else {
        return nil
    }
}

或者使用guard

convenience init?(data: [String: String]) {
    guard let name = data["name"], region = data["region"] else {
        return nil
    }
    self.init(name: name, season: region)
}