这个问题是我的老问题之一,我仍在努力解决它。我目前的解决办法是不使用TupleView,如下所示:
init(content: @escaping () -> Content) {
self.init(count: 1, content: content)
}下面是我只有一个视图可以工作的问题:
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) }
}
}我的目标是仅为一个视图解决初始化问题,使用与两个或多个视图相同的语法。
这里有一个用例:
struct ContentView: View {
var body: some View {
CustomView(content: {
Text("Hello, world!")
//Text("Hello, world!")
})
}
}但是Xcode会抛出以下错误:
无法推断
泛型参数'Content1‘不能将'Text’类型的值转换为闭包结果类型'TupleView<(Content1)>‘
该代码适用于2、3甚至10个视图,但当它仅为1时,我就有问题了!
正如我说的,我已经找到了解决我的问题的办法,正如我在这篇文章的顶部提到的。但是,我想解决我得到的错误,以及如何用正确的语法使用TupleView。
最新情况:
我的最终目标是实现这个初始化:

发布于 2021-11-09 05:37:34
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匹配。
更新:让我假设您希望在指定的init中只使用TupleView作为输入,然后您可以使用下面的内容(用Xcode 13 / iOS 15进行测试)
init<Content1: View>(content: @escaping () -> Content1) where Content == TupleView<(Content1)> {
self.init(count: 1, content: { TupleView(content()) })
}发布于 2021-11-09 00:28:56
TupleView甚至为单个视图定义了吗?如果视图本身可以直接使用,它的意义是什么?
init(content: @escaping () -> Content )
{
self.init(count: 1, content: content)
}https://stackoverflow.com/questions/69890539
复制相似问题