Swift,可以将包含整数的数组文字与整数数组互换使用吗?

时间:2019-02-19 17:41:39

标签: swift

在我的示例中,我有一个接受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)

这是怎么回事?

1 个答案:

答案 0 :(得分:5)

Swift中类型和文字之间有重要区别。

正如您所说,[1,2]是一个数组 literal 。不是数组。数组字面量基本上是可用于创建符合ExpressibleByArrayLiteral的任何类型的东西。

您可以使用数组文字来创建数组,但是可以使用它来创建其他类型,例如IndexSets。

通过printIndexSet([1, 2]),您可以使用数组文字来创建IndexSet。

然后printIndexSet(Array<Int>([1,2]))会给您一个错误,因为您的函数希望将IndexSet作为参数而不是Array。 希望这会有所帮助!

更新:

正如@rmaddy在我的答案下方的注释中正确指出的那样,IndexSet符合SetAlgebra,后者符合ExpressibleByArrayLiteral。这就是为什么您可以使用数组文字来创建IndexSet的原因。