我有一个简单的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。
答案 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
。