SwiftUI“ForEach”的数据类型和闭包类型不一致,未生成编译器错误?在这种情况下,类型推理是如何工作的?

pftdvrlh  于 2023-05-05  发布在  Swift
关注(0)|答案(1)|浏览(117)

下面的代码可以在没有警告或消息的情况下编译和运行,但它是如何工作的呢?

struct ContentView: View {
    var lists = ["a", "b"]
    var body: some View {
        VStack {
            ForEach(lists, id: \.self) { (str: String?) in 
                if let str {
                    Text(str)
                }
            }
        }
    }
}

看起来列表符合RandomAccessCollection<Element>,因此Element被推断为String,但我如何将(String?) -> some View类型的闭包传递给ForEach?它不应该只允许(String) -> Content类型的闭包吗?同样在RandomAccessCollection的描述中,为什么有两个Element类型?一个作为泛型参数传递,另一个是关联类型。它们是一种类型还是两种不同的类型?

pxq42qpu

pxq42qpu1#

这不是关于ForEachRandomAccessCollection,而是关于闭包,如果你在lists数组上使用forEachcompactMap等,你可以应用相同的闭包参数定义。

["a", "b"].forEach { (str: String?) in 
     if let str { print(str) }
 }

闭包是一个函数,当你将这个函数的参数定义为String?时,编译器就没有问题将String对象传递给闭包。相反的方法当然行不通,将参数定义为String,然后尝试传递一个可选值。

相关问题