首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决与TupleView一起工作的语法问题,其中Content == TupleView<( Content1 )>或Content == Content1

解决与TupleView一起工作的语法问题,其中Content == TupleView<( Content1 )>或Content == Content1
EN

Stack Overflow用户
提问于 2021-11-08 22:12:44
回答 2查看 91关注 0票数 1

这个问题是我的老问题之一,我仍在努力解决它。我目前的解决办法是不使用TupleView,如下所示:

代码语言:javascript
复制
init(content: @escaping () -> Content) {
    self.init(count: 1, content: content)
}

下面是我只有一个视图可以工作的问题:

代码语言:javascript
复制
 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) }
        
    }
    
}

我的目标是仅为一个视图解决初始化问题,使用与两个或多个视图相同的语法。

这里有一个用例:

代码语言:javascript
复制
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。

最新情况:

我的最终目标是实现这个初始化:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-09 05:37:34

ViewBuilder不为单个视图内容创建TupleView -它只是按原样返回。见下面的API合同:

代码语言:javascript
复制
@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
}

因此,不可能匹配表达式。

代码语言:javascript
复制
@ViewBuilder content: @escaping () -> Content) where Content == TupleView<(Content1)>

对于单个视图,因为它尝试ConcreteView == TupleView<(ConcreteView)>,这是不可能的。

因此,在您的情况下,尝试为单个视图使用ViewBuilder是错误的。因此,您的第一个变体不是解决方案,而是真正正确的解决方案,因为在输入生成器闭包中显式地将single viewContent匹配。

更新:让我假设您希望在指定的init中只使用TupleView作为输入,然后您可以使用下面的内容(用Xcode 13 / iOS 15进行测试)

代码语言:javascript
复制
init<Content1: View>(content: @escaping () -> Content1) where Content == TupleView<(Content1)> {
    self.init(count: 1, content: { TupleView(content()) })
}
票数 3
EN

Stack Overflow用户

发布于 2021-11-09 00:28:56

TupleView甚至为单个视图定义了吗?如果视图本身可以直接使用,它的意义是什么?

代码语言:javascript
复制
init(content: @escaping () -> Content ) 
{
    self.init(count: 1, content: content)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69890539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档