将视图注入到 SwiftUI 中的视图中

Nic*_* S. 4 ios swiftui

我试图将一个视图注入另一个视图以避免代码重复。

我想出了这个主意:

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)