在尝试回答这个问题时,我发现了一个奇怪的行为。
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 …