簡體   English   中英

當我的便利初始化程序在if.-let語句中運行self.init時,為什么Swift會給我一個編譯器錯誤?

[英]Why does Swift give me a compiler error when my convenience initializer runs self.init inside if an if-let statement?

這是我想要編譯的代碼示例:

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

錯誤消息可能會產生誤導。 如果初始化失敗,則必須顯式返回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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM