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

标签 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)

这里发生了什么?

最佳答案

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/

相关文章:

扩展中的 Swift #define

ios - Sprite 套件在纵向模式下无法在正确位置绘制线条

ios - 在带有用户键入值的文本字段中添加默认文本

ios - 从单元格中的 super View 中删除 View

ios - 如何在 Alamofire Swift 中发送带数组的字典

swift - uibackgroundTaskIdentifier - 应用程序关闭时 UIAlert 不会弹出

ios - 有没有一种快速的方法来确定 iPhone 型号是否比某个型号更新?

swift - 错误: Value of type 'CGRect' has no member 'center'

ios - 让球落入网(子节点)并做出嗖嗖的 Action ? (PhysicsBody/ARKit)

java - 快速将字符串转换为数据库 HTTP.UTF8