为什么不能用Int32索引下标Array?

时间:2018-07-26 07:56:59

标签: arrays swift subscript

您能告诉我为什么无法使用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

最后一行导致此错误:

  

不能用索引类型为'Int32'的'[UInt8]'类型的值下标

1 个答案:

答案 0 :(得分:3)

在Swift中,Array符合MutableCollection的定义,其中Index定义了关联的MutableCollection.subscript类型,用于下标。可以在以下subscript(position: Index) -> Element { get set } 签名中看到:

Array

MutableCollection的{​​{1}}实现中,Index类型被定义为Int。这就是Array期望其索引下标具有Int值的原因。


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

在后面的两个示例中,index1index2变量已分别明确地键入为IntInt32。当将index1传递到期望Array.subscript索引的Int时,类型匹配。但是,当将index2(类型为Int32的{​​{1}}传递给期望Array.subscript索引的Int时,类型不匹配。Array期望{{ 1}}索引和Int变量显式地键入为index2,这是另一种类型。没有索引类型的推断,因为这些值不是作为文字传递,而是作为特定类型。