在我的示例中,我有一个接受 IndexSet 的方法:
func printIndexSet(_ indexSet: IndexSet) {
indexSet.forEach {
print($0)
}
}
如果我尝试向它传递一个包含整数的数组文字,它可以推断出它的类型并构造一个 indexSet:
printIndexSet([1, 2]) // Compiles fine
如果我给它一个整数数组虽然它不会编译
// The following fail with error:
// Cannot convert value of type '[Int]' to expected argument type 'IndexSet'
printIndexSet(Array<Int>([1,2]))
let indices: [Int] = [1, 2]
printIndexSet(indices)
这里发生了什么?
最佳答案
Swift 中的类型和字面量之间存在重要区别。
正如您所说,[1, 2] 是一个数组文字。不是数组。数组文字基本上是可用于创建符合 ExpressibleByArrayLiteral 的任何类型的东西。
您可以使用数组文字来创建数组,但您也可以使用它来创建其他类型,例如 IndexSet。
与 printIndexSet([1, 2])
您使用数组字面量创建一个 IndexSet。
和printIndexSet(Array<Int>([1,2]))
给你一个错误,因为你的 func 期望 IndexSet 作为参数而不是数组。
希望这对您有所帮助!
更新:
正如@rmaddy 在我的回答下方的评论中正确指出的那样,IndexSet 符合 SetAlgebra,后者符合 ExpressibleByArrayLiteral。这就是为什么您可以使用数组字面量来创建 IndexSet。
关于Swift,包含整数的数组文字可以与整数数组互换使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54772047/