为什么我不能用 Int32 索引下标数组?
Why can't I subscript Array with a Int32 index?
你能告诉我为什么不能使用 Int32
(或 UInt
、UInt8
等)下标 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 }
在 MutableCollection
的 Array
实现中,Index
类型定义为 Int
。这就是为什么 Array
期望其索引下标的 Int
值。
在您问题的示例中,buffer[0] = 1
起作用的原因是因为 Int
(索引类型)和 UInt8
(元素类型)都符合 ExpressibleByIntegerLiteral
.当类型系统推断索引(和元素)的类型时,它发现传递的值要求类型符合 ExpressibleByIntegerLiteral
并且 Array.Index
要求类型为 Int
.由于这两个都是可满足的(因为 Int
符合 ExpressibleByIntegerLiteral
),类型系统推断 0
是一个 Int
。同样的过程适用于推断 1
是 UInt8
.
在后面的两个示例中,index1
和 index2
变量分别被显式键入为 Int
和 Int32
。将 index1
传递给需要 Int
索引的 Array.subscript
时,类型匹配。但是,当将 index2
(属于 Int32
类型的 Array.subscript
传递给需要 Int
索引的 Array.subscript
时,存在类型不匹配。Array
需要 Int
索引和 index2
变量被显式键入为 Int32
,这是一种不同的类型。没有索引类型的推断,因为这些值不是作为文字传递的,而是作为变量传递的特定类型。
你能告诉我为什么不能使用 Int32
(或 UInt
、UInt8
等)下标 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 }
在 MutableCollection
的 Array
实现中,Index
类型定义为 Int
。这就是为什么 Array
期望其索引下标的 Int
值。
在您问题的示例中,buffer[0] = 1
起作用的原因是因为 Int
(索引类型)和 UInt8
(元素类型)都符合 ExpressibleByIntegerLiteral
.当类型系统推断索引(和元素)的类型时,它发现传递的值要求类型符合 ExpressibleByIntegerLiteral
并且 Array.Index
要求类型为 Int
.由于这两个都是可满足的(因为 Int
符合 ExpressibleByIntegerLiteral
),类型系统推断 0
是一个 Int
。同样的过程适用于推断 1
是 UInt8
.
在后面的两个示例中,index1
和 index2
变量分别被显式键入为 Int
和 Int32
。将 index1
传递给需要 Int
索引的 Array.subscript
时,类型匹配。但是,当将 index2
(属于 Int32
类型的 Array.subscript
传递给需要 Int
索引的 Array.subscript
时,存在类型不匹配。Array
需要 Int
索引和 index2
变量被显式键入为 Int32
,这是一种不同的类型。没有索引类型的推断,因为这些值不是作为文字传递的,而是作为变量传递的特定类型。