我试图将一个视图注入另一个视图以避免代码重复。
我想出了这个主意:
struct WrapperView: View {
var injectedView: some View
var body: some View {
VStack {
injectedView
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误:Property declares an opaque return type, but has no initializer expression from which to infer an underlying type
我怎样才能在 SwiftUI 中实现这样的目标?
Geo*_*e_E 11
您可以使用泛型。在这里,类型Content符合View,因此我们可以传入类似 的内容Text。
就像是:
struct WrapperView<Content: View>: View {
let injectedView: Content
var body: some View {
VStack {
injectedView
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
WrapperView(injectedView: Text("Hello"))
Run Code Online (Sandbox Code Playgroud)
如果你想像创建时那样调用它VStack:
WrapperView {
Text("Hello")
}
Run Code Online (Sandbox Code Playgroud)
你可以改成WrapperView这样:
struct WrapperView<Content: View>: View {
private let injectedView: () -> Content
init(@ViewBuilder injectedView: @escaping () -> Content) {
self.injectedView = injectedView
}
var body: some View {
VStack(content: injectedView)
}
}
Run Code Online (Sandbox Code Playgroud)
我们使用@ViewBuilder这样我们就可以在闭包中构建视图内容,允许我们执行以下操作:
WrapperView {
Text("Hello")
Text("world!")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |