为什么我不能用 Int32 索引下标数组?

Why can't I subscript Array with a Int32 index?

你能告诉我为什么不能使用 Int32(或 UIntUInt8 等)下标 Array 的索引吗?以下代码显示了哪些有效,哪些无效的示例:

var buffer = [UInt8]()
buffer.append(0)

buffer[0] = 1    // Valid
buffer[-1] = 1   // Valid :)

var index1:Int = 0
buffer[index1] = 1 // Valid

var index2:Int32 = 0
buffer[index2] = 1 // Invalid

最后一行导致此错误:

Cannot subscript a value of type '[UInt8]' with an index of type 'Int32'

在 Swift 中,Array 符合(除其他事项外)MutableCollection,它定义了关联的 Index 类型,用于下标。这可以在以下 MutableCollection.subscript 签名中看到:

subscript(position: Index) -> Element { get set }

MutableCollectionArray 实现中,Index 类型定义为 Int。这就是为什么 Array 期望其索引下标的 Int 值。


在您问题的示例中,buffer[0] = 1 起作用的原因是因为 Int(索引类型)和 UInt8(元素类型)都符合 ExpressibleByIntegerLiteral.当类型系统推断索引(和元素)的类型时,它发现传递的值要求类型符合 ExpressibleByIntegerLiteral 并且 Array.Index 要求类型为 Int .由于这两个都是可满足的(因为 Int 符合 ExpressibleByIntegerLiteral),类型系统推断 0 是一个 Int。同样的过程适用于推断 1UInt8.

在后面的两个示例中,index1index2 变量分别被显式键入为 IntInt32。将 index1 传递给需要 Int 索引的 Array.subscript 时,类型匹配。但是,当将 index2(属于 Int32 类型的 Array.subscript 传递给需要 Int 索引的 Array.subscript 时,存在类型不匹配。Array 需要 Int 索引和 index2 变量被显式键入为 Int32 ,这是一种不同的类型。没有索引类型的推断,因为这些值不是作为文字传递的,而是作为变量传递的特定类型。