委托结构中的初始化程序没有标记为“方便”

时间:2017-05-25 15:03:50

标签: swift

我一直收到这个错误,我不明白为什么。

  

错误:在结构中委派初始值设定项未标记为“方便”

这就是我所拥有的(例如),DeprecatedCurrencySupportedCurrency

struct DeprecatedCurrency {
    let code: String
}

struct SupportedCurrency {
    let code: String
}

然后我想添加一个便利初始化函数,用于从弃用的货币对象转换为新的货币对象。这就是我所拥有的:

struct DeprecatedCurrency {
    let code: String
}

struct SupportedCurrency {
    let code: String

    convenience init(_ currecny: DeprecatedCurrency) { // error!!
        self.init(code: currecny.code)
    }

    init(code: String) {
        self.code = code
    }
}

这个错误甚至意味着什么,我该如何解决?

我知道如果我们不提供默认初始值设定项,将使用Swift中的struct自动为我们生成带有签名init(code: String)的初始值设定项。所以到了最后,我真正想要的是(如果可能的话):

struct SupportedCurrency {
    let code: String

    convenience init(_ currecny: DeprecatedCurrency) { // error!!
        self.init(code: currecny.code)
    }
}

3 个答案:

答案 0 :(得分:12)

只需删除conveniencestruct不需要。

来自Swift文档。

  

初始化程序可以调用其他初始化程序来执行实例初始化的一部分。此过程称为初始化程序委派,可避免跨多个初始化程序复制代码。

他们没有提到使用convenience。语义为convenience,但不需要关键字。

struct DeprecatedCurrency {
    let code: String
}

struct SupportedCurrency {
    let code: String

    init(_ currency: DeprecatedCurrency) { // error!!
        self.init(code: currency.code)
    }

    init(code: String) {
        self.code = code
    }
}

答案 1 :(得分:7)

结构不需要单词convenience

试试这个:

struct SupportedCurrency {
    let code: String

    init(_ currency: DeprecatedCurrency) { // error!!
        self.init(code: currency.code)
    }

    init(code: String) {
        self.code = code
    }
}

问题不在于我们为什么不将convenience放在结构上,而是为什么我们将convenience用于类。原因是类具有继承性。对于一个类,你需要调用超类的指定构造函数(不确定这是否是正确的术语,它来自Objective-C的初始化器。单词convenience将构造函数标记为“不是指定的构造函数”。 / p>

答案 2 :(得分:3)

一种选择是在init的{​​{1}}中添加新的extension。这样,您就不会失去struct自动生成的成员初始化程序。

default

来自Apple docs

注意

如果您希望自定义值类型可以使用进行初始化 默认的初始化程序和成员初始化程序,以及您自己的 自定义初始化程序,在扩展中编写自定义初始化程序 而不是作为值类型的原始实现的一部分。对于 详细信息,请参阅扩展。