SwiftUI,使用ForEach的参数导致错误“无法推断闭包类型”

时间:2019-10-12 07:47:13

标签: swift xcode swiftui

我有一个简单的View结构,其中有一个AnyView数组。在body中,我尝试使用ForEach遍历数组。

struct TestView<Content>: View where Content : View
{
    var Cells: [AnyView] = []

    init<Data: RandomAccessCollection, ID, Item: View>(
        @ViewBuilder content: () -> Content)
        where Content == ForEach<Data, ID, Item>
    {
        let Views = content()
        Cells = Views.data.map { AnyView(Views.content($0)) }
    }

    func test(_ i: UInt) -> CGPoint
    {
        return CGPoint(x: 0.0, y: 0.0)
    }

    func test() -> CGPoint
    {
        return CGPoint(x: 0.0, y: 0.0)
    }

    var body: some View {
        ZStack {
            ForEach(0..<self.Cells.count, id: \.self) {i in
                Text("").position(self.test(i))
            }
        }
    }
}

但是在编译时,它在ForEach行上给出了错误:“无法在当前上下文中推断闭包类型”。是什么导致此错误?

请注意,我对test()有2个定义。如果我使用不带参数的那个,错误就会消失。 (为什么...?)同样,如果我将self.Cells.count替换为常数(例如“ 10”),错误也会消失。

我正在使用Xcode 11.1。

1 个答案:

答案 0 :(得分:1)

您的问题是test的参数是UInt,而0..<self.Cells.count的类型是Range<Int>,因此编译器将i推断为{{1 }}。当您将其传递给函数时,该函数期望一个Int,并且编译器无法将其从UInt隐式转换为Int,因此您必须这样做。这是一种方法:

UInt

解决问题的另一种方法是,只需将测试函数的参数更改为var body: some View { ZStack { ForEach(0..<self.Cells.count, id: \.self) { i in Text("").position(self.test(UInt(exactly: i) ?? 0)) } } } 类型,然后在需要时将其强制转换为Int,如果您确实需要将其设为{{ 1}},而不仅仅是UInt