SwiftUI如何使用Text中的字符串文字来创建LocalizedStringKey?

h6my8fg2  于 2023-06-21  发布在  Swift
关注(0)|答案(1)|浏览(104)

我想有我的自定义视图的工作方式像文本。如果我传递一个字符串字面量,我希望它是使用LocalizedStringKey创建的,如果我传递一个变量,我希望它被视为一个字符串(同样与verbatim:)。我做了一个小测试,在init上使用与Text相同的签名,如果我传递一个文字,它会转到StringProtocol init。这是如何与文本?

weylhg0b

weylhg0b1#

我做了一个小测试,在init上使用与Text相同的签名,如果我传递一个文字,它会转到StringProtocol init。
我猜你做了这样的事情:

init<S: StringProtocol>(_ x: S) {}
init(_ x: LocalizedStringKey) {}

你发现第一个重载总是被调用。
这可以通过将StringProtocol重载标记为@_disfavoredOverload来修复。请注意,由于它有一个下划线前缀,因此它不是一个稳定的功能,将来可能会更改。
但这确实是SwiftUI中的Text所使用的(至少目前是这样)。@_disflavoredOverload被记录在这个markdown文件中。这里的例子显示了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) { ... }
}

相关问题