When creating a custom view, it is common to init with a String, either with localization or not. This post will explore a few ways to init the custom view (largely depends on your requirement).
Take a simple TagView as an example.
struct TagView: View {
let text: LocalizedStringKey
var body: some View {
Text(text)
.padding()
.background(
RoundedRectangle(cornerRadius: 4)
.strokeBorder(.green, lineWidth: 1)
)
}
}
In the above, the view simply provide the LocalizedStringKey property. This supports localization as opposed to using String type.
Supporting both LocalizedStringKey & String
You have seen how Text provides different initializations supporting either types.
We can support similarly, with the following initializations.
struct TagView: View {
let text: Text
init(_ text: LocalizedStringKey) {
self.text = Text(text)
}
@_disfavoredOverload
init<S>(_ text: S) where S : StringProtocol {
self.title = Text(text)
}
}
The attribute @_disfavoredOverload is to ignore the init when overloaded (prioritize the init with LocalizedStringKey).
We also kind of cheated, changing the property to a full fledge Text type. But this is rather common eg. Label is made up of Text + Image. They are view representation anyway, so it is fine to provide in a custom view.
You can even init directly with a Text, giving call sites the power bold it, change the font, or whatever.
As said in the beginning, it depends on your requirement and how much you want to expose.