Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么可以';具有Int32索引的ti下标数组?_Arrays_Swift_Subscript - Fatal编程技术网

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中的任何一个具有相同的大小