我使用 Package 多语言字符串的结构,很容易意外地打印结构类型名称而不是字符串,如下所示:
struct MultilangStringStruct {
let en: String
let de: String
init(en: String, de: String) {
self.en = en
self.de = de
}
}
let s = MultilangStringStruct(en: "Of course", de: "Jawohl")
/// Oops, we forgot to use s.en, and it prints this, with no compiler warning:
/// Commander said "MultilangString(en: "Of course", de: "Jawohl")"!
print("The commander said \"\(s)\"!")
字符串
我可以通过某种方式修改结构体来防止这种隐式转换为字符串吗?我希望swift编译器能够产生错误或警告,我可以注意到,并将s
修复为s.en
。
2条答案
按热度按时间7uhlpewt1#
我还在寻找一种方法来禁用自定义类型的字符串插值,这种方法会导致编译时错误。我找到了一种方法,并认为我会分享给将来想要这样做的任何人:
您可以通过为类型提供两种不同的插值来实现这一点,从而导致
Ambiguous use of 'appendInterpolation'
编译器错误。一种可重复使用的方法可以像这样:
字符串
然后将
DisableInterpolation
协议一致性添加到要禁用插值的类型,如下所示:型
然后,当你像
print("Value is \(myValue)")
一样插值时,编译器会报错,说Ambiguous use of 'appendInterpolation'
:**注意:**如果你只做
print(myValue)
,这不会导致编译器错误,它只会在做字符串插值时导致错误。这对我的用例来说已经足够了。rmbxnbpk2#
您可以使用
CustomStringConvertible
协议自定义文本表示。Apple doc在
description
属性中,可以使用os.log
中的os_log
或Foundation
中的NSLog
将日志记录添加到控制台。示例
字符串