這個問題是我的老問題之一,我仍在努力解決。我目前的解決方法是不使用TupleView,如下所示:
init(content: @escaping () -> Content) {
self.init(count: 1, content: content)
}
這是當我只有 1 個視圖可以作業時的問題:
struct CustomView<Content: View>: View {
let count: Int
let content: () -> Content
private init(count: Int, content: @escaping () -> Content) {
self.count = count
self.content = content
}
// Here: is the issue!!! // <<: Here
init<Content1: View>(@ViewBuilder content: @escaping () -> Content) where Content == TupleView<(Content1)> {
self.init(count: 1, content: content)
}
init<Content1: View, Content2: View>(@ViewBuilder content: @escaping () -> Content) where Content == TupleView<(Content1, Content2)> {
self.init(count: 2, content: content)
}
// ... init for 3,4,5,6,7,8,9,10
var body: some View {
content()
.onAppear() { print(count) }
}
}
我的目標是解決僅針對 1 個視圖的初始化問題,其語法與我用于 2 個或更多視圖的語法相同。
這是一個用例:
struct ContentView: View {
var body: some View {
CustomView(content: {
Text("Hello, world!")
//Text("Hello, world!")
})
}
}
但是 Xcode 會拋出這些錯誤:
無法推斷通用引數“Content1”
無法將“Text”型別的值轉換為閉包結果型別“TupleView<(Content1)>”
該代碼適用于 2、3 甚至 10 個視圖,但是當它只有 1 個時我會遇到問題!
As I said, I have found a workaround for my issue as I mentioned at the top of this post. But, I want to solve the errors that I get and how to use TupleView with the correct syntax.
update:
My final goal was and is to have this initializations:

uj5u.com熱心網友回復:
在ViewBuilder不創建TupleView單一視圖內容-它只是回傳它就好了。請參閱以下 API 合同:
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
@resultBuilder public struct ViewBuilder {
...
/// Passes a single view written as a child view through unmodified.
///
/// An example of a single view written as a child view is
/// `{ Text("Hello") }`.
public static func buildBlock<Content>(_ content: Content) -> Content where Content : View
}
所以不可能匹配運算式
@ViewBuilder content: @escaping () -> Content) where Content == TupleView<(Content1)>
對于單一視圖,因為它會嘗試ConcreteView == TupleView<(ConcreteView)>,這是不可能的。
因此,ViewBuilder在您的情況下嘗試使用單一視圖是錯誤的。所以你的第一個變種是不是一個解決辦法,但真正正確的解決方案,因為明確匹配single view的Content輸入建設者關閉。
更新:讓我假設您只想TupleView在指定中作為輸入init,然后您可以在下面使用(使用 Xcode 13 / iOS 15 測驗)
init<Content1: View>(content: @escaping () -> Content1) where Content == TupleView<(Content1)> {
self.init(count: 1, content: { TupleView(content()) })
}
uj5u.com熱心網友回復:
甚至為單個視圖定義了 TupleView 嗎?如果視圖本身可以直接使用,那有什么意義。
init(content: @escaping () -> Content )
{
self.init(count: 1, content: content)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354979.html
上一篇:以編程方式更改狀態時可以為NSSwitch設定影片嗎?
下一篇:如何在Swift中檢測Fn按鍵?
