我一直收到这个错误,我不明白为什么。
错误:在结构中委派初始值设定项未标记为“方便”
这就是我所拥有的(例如),DeprecatedCurrency
和SupportedCurrency
。
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)
}
}
答案 0 :(得分:12)
只需删除convenience
,struct
不需要。
来自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
注意
如果您希望自定义值类型可以使用进行初始化 默认的初始化程序和成员初始化程序,以及您自己的 自定义初始化程序,在扩展中编写自定义初始化程序 而不是作为值类型的原始实现的一部分。对于 详细信息,请参阅扩展。