相关疑难解决方法(0)

为什么 LocalizedStringKey 的行为取决于我是否将字符串插值传递给其初始化程序?

在尝试回答这个问题时,我发现了一个奇怪的行为。

Text(LocalizedStringKey("Hello \(Image(systemName: "globe"))"))
Run Code Online (Sandbox Code Playgroud)

显示一个地球仪,但是

Text(LocalizedStringKey("Hello {world}".replacingOccurrences(of: "{world}", with: "\(Image(systemName: "globe"))")))
Text(LocalizedStringKey("Hello" + "\(Image(systemName: "globe"))"))
Run Code Online (Sandbox Code Playgroud)

显示“Hello”,然后是一堆 SwiftUI 内部术语。

一个更简单的例子是:

let x = "\(Image(systemName: "globe"))"
print(LocalizedStringKey.init(x))
print(LocalizedStringKey.init("\(Image(systemName: "globe"))"))
Run Code Online (Sandbox Code Playgroud)

我传递给的值LocalizedStringKey.init应该是相同的"\(Image(systemName: "globe"))",但是第一个打印

LocalizedStringKey(key: "%@", hasFormatting: true, arguments: [...])

和第二张照片

LocalizedStringKey(key: "Image(provider: SwiftUI.ImageProviderBox<SwiftUI.Image.(unknown context at $7ff91ccb3380).NamedImageProvider>)", hasFormatting: false, arguments: [])

似乎LocalizedStringKey.init改变其行为取决于我传递的参数是否是(内插的)字符串文字。

据我所知,这两个调用正在LocalizedStringKey.init调用相同的初始化程序。中只有一个无参数标签初始化程序LocalizedStringKey,它采用String.

如果还有一个接受 a 的初始化程序LocalizedStringKey,结果会更容易理解。毕竟LocalizedStringKey 有自定义的字符串插值规则,而且是专门针对的。Image但据我所知,这是唯一没有参数标签的初始化程序。

如果初始化器的参数是 ,这也可以理解@autoclosure () -> String …

string-interpolation swift swiftui localizedstringkey

5
推荐指数
1
解决办法
488
查看次数