我正在尝试创建一个自定义 SwiftUI 视图,可以使用 aLocalizedStringKey
或StringProtocol
就像内置 SwiftUI 一样进行初始化Button
。好处是我可以使用自动本地化的字符串或假定已本地化的参数来初始化自定义视图。
苹果在这里描述了这种用法:
作为一般规则,当您需要本地化时,请使用字符串文字参数;当您不需要本地化时,请使用字符串变量参数。
来源:https://developer.apple.com/documentation/swiftui/localizedstringkey
这是我的代码:
import SwiftUI
struct CustomView<Content: View>: View {
private let title: String
@ViewBuilder let content: Content
init(_ titleKey: LocalizedStringKey, @ViewBuilder content: () -> Content) {
self.title = ???
self.content = content()
}
init<S>(_ title: S, @ViewBuilder content: () -> Content) where S : StringProtocol {
self.title = ???
self.content = content()
}
var body: some View {
ZStack {
Color.green
Text(self.title)
}
}
}
在这两个初始化程序中都不清楚我应该如何设置title
在body
.
我认为苹果在这里使用了某种模式,但目前还不清楚如何实现这一点。
我意识到我可以在自定义视图中存储两个变量;一个用于 ,LocalizedStringKey
另一个用于String
,然后有一个在 中使用适当输入类型的开关body
。但这似乎比我预期的工作量要多一些。
任何帮助表示赞赏。
使用
Text
。Text
将 a 传递给其他 SwiftUI 视图不会有任何问题。LocalizedStringKey
所有可以接受 a或 的SwiftUI 类型StringProtocol
也会有一个重载,该重载要么接受 a@ViewBuilder
(例如 a 的标签Button
),要么只是一个普通的Text
(例如 aTableColumn
或的标签SharePreview
)。您还应该
StringProtocol
用 标记重载@_disfavoredOverload
,以便传递字符串文字将解析为LocalizedStringKey
重载。SwiftUI 本身可能也用来执行此操作,因为我们可以看到,采用/通常要求该视图的类型参数为 的
Text
内置视图初始化程序。LocalizedStringKey
StringProtocol
Label
Text
一般来说,该模式看起来像这样:
对于可以与任何类型的标签一起使用的视图,它将有一个
@ViewBuilder
像上面这样的初始化程序。如果您的视图仅支持文本,那么它将有一个采用Text
. 也考虑将这样的重载添加到您的视图中。这允许您的视图的用户通过使用诸如, ,之类的内容来传递样式文本。.bold()
.font()
.foregroundStyle()