[英]SwiftUI TupleView and generics, how to parse recursively tuple of some View and Group
[英]How can I change return view type from <TupleView<(View, View)>> to <_> for initialization?
我有一個以<TupleView<(View, View)>>
形式返回視圖的視圖,如下所示:
知道這兩種方法都有效並且我希望的方法是在掩護下使用TupleView但具有<_>
的外觀,我嘗試在MyView3上工作,正如您在我嘗試過的代碼中看到的那樣我想要這種外觀(content: () -> _) -> MyView3<_>
更簡單易懂,但我需要 TupleView 方式初始化卧底。 我為MyView3遇到了 3 個錯誤以使其正常工作。 你認為有沒有辦法實現我的目標?
有關詳細信息,請參閱此代碼:
struct ContentView: View {
var body: some View {
MyView1(content: {
Text("Text 1").fixedSize()
Text("Text 2").fixedSize()
})
.padding()
MyView2(tupleViewContent: {
Text("Text 3").fixedSize()
Text("Text 4").fixedSize()
})
.padding()
// This part has issue!
MyView3(content: {
Text("Text 5").fixedSize()
Text("Text 6").fixedSize()
})
.padding()
}
}
struct MyView1<Content: View>: View {
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
content()
}
}
struct MyView2<Content: View>: View {
let content: () -> Content
init<Content1: View, Content2: View>(@ViewBuilder tupleViewContent: @escaping () -> Content) where Content == TupleView<(Content1, Content2)> {
self.content = tupleViewContent
}
var body: some View {
content()
}
}
struct MyView3<Content: View>: View {
let content: () -> Content
private init<Content1: View, Content2: View>(@ViewBuilder tupleViewContent: @escaping () -> Content) where Content == TupleView<(Content1, Content2)> {
self.content = tupleViewContent
}
init(@ViewBuilder content: @escaping () -> Content) {
//Error:
// Generic parameter 'Content1' could not be inferred
// Generic parameter 'Content2' could not be inferred
// Initializer 'init(tupleViewContent:)' requires the types 'Content' and 'TupleView<(Content1, Content2)>' be equivalent
self.init(tupleViewContent: content)
}
var body: some View {
content()
}
}
generics是在編譯時解析的,所以init/s應該go從more specific到more common(最后到designated one)。
在你的情況下它應該像(用 Xcode 13.2 測試)
struct MyView3<Content: View>: View {
let content: () -> Content
init<Content1: View, Content2: View>(@ViewBuilder tupleViewContent: @escaping () -> Content) where Content == TupleView<(Content1, Content2)> {
self.init(content: tupleViewContent)
}
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
content()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.