【问题标题】:Why does Swift give me a compiler error when my convenience initializer runs self.init inside if an if-let statement?当我的便利初始化程序在 if-let 语句中运行 self.init 时,为什么 Swift 会给我一个编译器错误?
【发布时间】:2015-10-13 15:45:15
【问题描述】:

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

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")
    }
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    错误信息可能具有误导性。如果初始化失败,您必须显式返回nil,如中所述 文档"Failable Initializers":

    你在一个失败的初始化器中写 return nil 来表示一个点 可以触发初始化失败。

    这意味着在你的情况下你必须添加一个 else 情况 如果可选绑定失败:

    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)
    }
    

    【讨论】:

    • 谢谢!应该更仔细地阅读文档。如果编译器错误描述了您指出的内容,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多