我希望我的自定义视图像文本一样工作.如果我传递一个字符串文字,我希望使用LocalizedStringKey创建它,如果我传递一个变量,我希望它被视为字符串(Verbatim:也是如此).我做了一个小测试,在init上使用与文本相同的签名,如果我传递一个文本,它将传递给StringProtocol init.这是如何处理文本的呢?
我希望我的自定义视图像文本一样工作.如果我传递一个字符串文字,我希望使用LocalizedStringKey创建它,如果我传递一个变量,我希望它被视为字符串(Verbatim:也是如此).我做了一个小测试,在init上使用与文本相同的签名,如果我传递一个文本,它将传递给StringProtocol init.这是如何处理文本的呢?
我做了一个小测试,在init上使用与文本相同的签名,如果我传递一个文本,它将传递给StringProtocol init.
我猜你做过这样的事:
init<S: StringProtocol>(_ x: S) {}
init(_ x: LocalizedStringKey) {}
您会发现第一个重载总是被调用.
这可以通过用@_disfavoredOverload
标记StringProtocol
过载来修复.请注意,由于这是一个带下划线的前缀,因此它不是一个稳定的功能,将来可能会更改.
但这确实是SwiftUI中的Text
所使用的(至少目前是这样).@_disflavoredOverload
被记录在this markdown file中.那里的示例显示了LocalizableStringKey
的确切问题:
extension LocalizedStringKey: ExpressibleByStringLiteral { ... } extension Text { // We want `Text("foo")` to use this initializer: init(_ key: LocalizedStringKey) { ... } // But without @_disfavoredOverload, it would use this one instead, // because that lets it give the literal its default type: @_disfavoredOverload init<S: StringProtocol>(_ str: S) { ... } }