我希望我的自定义视图像文本一样工作.如果我传递一个字符串文字,我希望使用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) { ... }
}

Swift相关问答推荐

绑定到可选值的非可选属性?'

查找数组中 ** 元素 ** 的属性的最小值和最大值

如果通过计时器循环运行,则检索CPU利用率百分比的SWIFT脚本运行良好.似乎在没有计时器的情况下停留在初始百分比上

从Firebase播放音频文件不起作用

将NavigationSplitView更改为NavigationStack

';NSInternal不一致异常';,原因:';可见导航栏Xcode 15.0 Crash请求布局

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

减小SF符号的边框宽度

为什么我在我的 Swift iOS 应用程序项目中收到 Xcode 中的错误消息无法识别的 Select 器发送到类?

If 语句在 Swift 中有 2 个日期

MacOS KIND 是如何实现的

快速更改tableView中的数据

为什么 performSegue() 不调用 shouldPerformSegue()

符合协议 - 错误?

如何在 Swift 中将 XPC 自定义类列入白名单?

在 Swift 框架中加载资源(例如故事板)

在 Swift 中将计时器标签格式化为小时:分钟:秒

使用 ARAnchor 插入 node 和直接插入 node 有什么区别?

SwiftUI:将多个 BindableObjects 放入环境

显示 UIAlertController 的简单 App Delegate 方法(在 Swift 中)