在我的示例中,我有一个接受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)
这是怎么回事?
答案 0 :(得分:5)
Swift中类型和文字之间有重要区别。
正如您所说,[1,2]是一个数组 literal 。不是数组。数组字面量基本上是可用于创建符合ExpressibleByArrayLiteral的任何类型的东西。
您可以使用数组文字来创建数组,但是可以使用它来创建其他类型,例如IndexSets。
通过printIndexSet([1, 2])
,您可以使用数组文字来创建IndexSet。
然后printIndexSet(Array<Int>([1,2]))
会给您一个错误,因为您的函数希望将IndexSet作为参数而不是Array。
希望这会有所帮助!
更新:
正如@rmaddy在我的答案下方的注释中正确指出的那样,IndexSet符合SetAlgebra,后者符合ExpressibleByArrayLiteral。这就是为什么您可以使用数组文字来创建IndexSet的原因。