Arrays 为什么可以';具有Int32索引的ti下标数组?
您能告诉我为什么不能使用Arrays 为什么可以';具有Int32索引的ti下标数组?,arrays,swift,subscript,Arrays,Swift,Subscript,您能告诉我为什么不能使用Int32(或UInt,UInt8等)索引来下标数组?下面的代码显示了哪些工作和哪些不工作的示例: 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 //
Int32
(或UInt
,UInt8
等)索引来下标数组
?下面的代码显示了哪些工作和哪些不工作的示例:
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]”类型的值下标
在Swift中,
数组
除其他外符合-可变集合
,它定义了一个关联的索引
类型,用于订阅。这可以在以下MutableCollection.subscript
签名中看到:
subscript(position: Index) -> Element { get set }
在数组
的可变集合
实现中,索引
类型定义为Int
。这就是为什么Array
要求其索引下标具有Int
值的原因
在您问题中的示例中,
buffer[0]=1
之所以有效,是因为Int
(索引类型)和UInt8
(元素类型)都符合ExpressibleByIntegerLiteral
。当类型系统推断索引(和元素)的类型时,它看到传递的值要求类型符合ExpressibleByIntegerLiteral
,并且Array.index
要求类型为Int
。由于这两者都是可满足的(因为Int
符合ExpressibleByIntegerLiteral
),类型系统推断0
是Int
。同样的过程也适用于推断1
是UInt8
在后面的两个示例中,
index1
和index2
变量分别显式键入为Int
和Int32
。将index1
传递给Array.subscript
时,需要Int
索引,类型匹配。但是,当传递index2
(类型为Int32
到Array。下标
需要Int
索引时,存在类型不匹配。Array
需要Int
索引,而index2
变量显式类型为Int32
,这是一种不同的类型。没有对索引类型的推断,因为这些值不是作为文本传递的,而是作为具有特定类型的变量传递的。在Swift中,数组
符合-可变集合
,它定义了一个关联的索引
类型,用于下标。这可以在下面的可变集合.下标
签名中看到e:
subscript(position: Index) -> Element { get set }
在数组
的可变集合
实现中,索引
类型被定义为Int
。这就是数组
需要其索引下标的Int
值的原因
在您问题中的示例中,
buffer[0]=1
之所以有效,是因为Int
(索引类型)和UInt8
(元素类型)都符合ExpressibleByIntegerLiteral
。当类型系统推断索引(和元素)的类型时它看到传递的值要求类型符合ExpressibleByIntegerLiteral
,而Array.Index
要求类型为Int
。因为这两者都是可满足的(因为Int
符合ExpressibleByIntegerLiteral
),类型系统推断0
是Int
。同样的过程也适用于推断1
是UInt8
在后面的两个示例中,
index1
和index2
变量分别显式键入为Int
和Int32
。将index1
传递到Array.subscript
时,需要Int
索引,类型匹配。但是,当传递index2
(类型为Int32
到Array。下标
需要Int
索引时,存在类型不匹配。Array
需要Int
索引,而index2
变量显式类型为Int32
,这是一种不同的类型。没有对索引类型的推断,因为这些值不是以文字形式传递的,而是作为特定类型的变量传递的。请编辑您的问题,不要使用诸如“荒谬”之类的词组,也不要用粗体大写字母书写单词。因为数组
的索引类型是的关联类型索引
(可变)集合
符合数组
的协议定义为Int
请编辑您的问题,不要使用诸如“荒谬”之类的词组,也不要用粗体大写字母书写单词。因为数组
的索引类型是的关联类型索引
(可变)数组符合的集合
协议定义为Int
“在32位平台上,Int与Int32大小相同,在64位平台上,Int与Int64大小相同。”请参阅。如果Index
预期Int
它将在32位系统上工作。是的,根据平台的不同,Int
可能与Int32
或Int64
大小相同,但大小相同并不意味着类型相同。我认为你是对的,因为Int32
和Int64
都不是将其标记为Index
Int
对其中任何一个来说都不是typealias
。“在32位平台上,Int的大小与Int32相同,在64位平台上,Int的大小与Int64相同。”请参阅。如果Index
预期Int
它将在32位系统上工作。是的,取决于平台Int
可能与Int32中的任何一个具有相同的大小