编译器如何自动推断多泛型类型SwiftUI视图的类型?

inn6fuwd  于 2022-12-17  发布在  Swift
关注(0)|答案(1)|浏览(127)

背景

我有一个泛型SwiftUI View,它有两个泛型类型,第一个需要手动指定,而第二个可以通过传递给它的Initialiser的内容来推断。
然而,Compiler迫使我在使用视图时手动指定两个泛型类型,这导致了非常复杂的定义,如下面的示例所示。

代码

protocol Entity {
    static var name: String { get }
}

struct EntityView<E: Entity, Content: View>: View {
    private let content: Content
    
    init(@ViewBuilder content: () -> Content) {
        self.content = content()
    }
    
    var body: some View {
        VStack {
            Text(E.name)

            content
        }
    }
}

struct ContentView {
    var body: some View {
        EntityView<Profile, TupleView<(HStack<EmptyView>, HStack<EmptyView>, Text)>> { // This is obviously not clean to define manually.
            HStack { ... }

            HStack { ... }

            Text("Hello World")
        }
    }
}

问题

是否有任何“更干净”的方法来实现这个功能?是否有可能以某种方式只定义无法推断的泛型类型?

iezvtpos

iezvtpos1#

Swift需要推断 * 所有 * 类型参数,或者必须显式指定 * 所有 * 类型参数。
Swift推断类型参数的一个地方是参数列表,因此,要使它也“推断”E,添加一个包含E.Type的参数。

init(_ type: E.Type, @ViewBuilder content: () -> Content) {
    self.content = content()
}

然后,在使用视图时,传递Profile.self

EntityView(Profile.self) {
    ...
}

相关问题