Swift 结构中的委托初始值设定项未标记为';方便';

Swift 结构中的委托初始值设定项未标记为';方便';,swift,Swift,我一直在犯这个错误,我不明白为什么 错误:结构中的委托初始值设定项未标记为“便利” 这就是我所拥有的(例如,DeprecatedCurrency和SupportedCurrency) struct DeprecatedCurrency { let code: String } struct SupportedCurrency { let code: String } 然后,我想添加一个便利的init函数,用于将不推荐使用的货币对象转换为新的货币对象。这就是我所拥有的: str

我一直在犯这个错误,我不明白为什么

错误:结构中的委托初始值设定项未标记为“便利”

这就是我所拥有的(例如,
DeprecatedCurrency
SupportedCurrency

struct DeprecatedCurrency {
    let code: String
}

struct SupportedCurrency {
    let code: String
}
然后,我想添加一个便利的init函数,用于将不推荐使用的货币对象转换为新的货币对象。这就是我所拥有的:

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

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

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

问题不在于我们为什么不为结构设置
便利性
,而在于我们为什么为类设置
便利性
。原因是类具有继承性。对于一个类,您需要调用超类的指定构造函数(不确定这是否是正确的术语,它来自Objective-C的初始值)。单词
便利性
将构造函数标记为“非指定构造函数”。

只需删除
便利性
结构不需要它

来自
Swift
文档

初始值设定项可以调用其他初始值设定项来执行实例的部分初始化。此过程称为初始值设定项委派,可避免在多个初始值设定项之间重复代码

他们没有提到使用
便利性
。它在语义上是
便利性
,但不需要关键字

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

一个选项是在
结构的
扩展中添加新的
init
。这样,您就不会丢失
默认的
自动生成的成员初始化器

struct-SupportedCurrency{
让代码:字符串
}
扩展支持的货币{
初始(uu货币:弃用货币){
self.init(代码:currency.code)
}
}

如果希望自定义值类型可以使用 默认初始值设定项和成员初始值设定项,以及您自己的初始值设定项 自定义初始值设定项,在扩展名中编写自定义初始值设定项 而不是作为值类型原始实现的一部分 更多信息,请参阅扩展


你有没有试着从那行中删除“便利”一词?它的修复建议是什么?(提示)@YuchenZhong它在技术上仍然是一个便利的初始化器(因为它链接到另一个初始化器)–您不需要
便利性
关键字,因为便利性和结构的指定初始值设定项之间没有有用的区别,因为您无法链接到
super
@Hamish。提示建议只需删除它,它就可以工作。我正在跳到获取默认初始值设定项
init(代码:String)
通过标记
init(\currencny:DeprecatedCurrency)生成
方便。如果不可能,我想我只能这样做了……一旦你添加了任何类型的显式构造函数,默认构造函数就会消失——不幸的是。我认为有人谈论过改变行为,但没有任何结果。@sdadas它完全回答了最初提出的问题。高/低质量不是f长度。该问题还询问了错误的含义。最初,您没有回答该问题。现在您已经得到了实际答案,我删除了否决票。因此,您可以说,最糟糕的情况是,该问题的答案不完整,即使可以通过说“结构不需要<代码>方便”很容易推断出来因为这就是正在发生的事情。当结构不需要方便时,他把
方便性
。无论如何,感谢你提供反馈(并取消否决票)。许多人不会为此烦恼,特别是在受到质疑之后。
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
    }
}