【问题标题】:Why can't I subscript Array with a Int32 index?为什么我不能用 Int32 索引为数组下标?
【发布时间】:2018-07-26 07:56:59
【问题描述】:

你能告诉我为什么不能使用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]”类型的值下标

【问题讨论】:

  • 请编辑您的问题,避免使用“Ridiculous”之类的爆发和用粗体大写字母书写单词。
  • 因为Arrayindex类型作为(Mutable)Collection所遵循的(Mutable)Collection协议的关联类型Index被定义为Int跨度>

标签: arrays swift subscript


【解决方案1】:

在 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),类型系统推断0Int。同样的过程也适用于推断1UInt8

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

【讨论】:

  • "在 32 位平台上,Int 与 Int32 大小相同,在 64 位平台上,Int 与 Int64 大小相同。"见developer.apple.com/documentation/swift/int。如果 Index 期望 Int 它将在 32 位系统上工作。
  • 是的,取决于平台,Int 可能与Int32Int64 具有相同的大小,但具有相同的大小并不能使其成为相同的类型。
  • 我认为你是对的,因为 Int32Int64 都不能作为 Index 工作。 Int 对他们中的任何一个都不是 typealias
猜你喜欢
  • 1970-01-01
  • 2015-01-02
  • 2012-05-21
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2012-04-27
相关资源
最近更新 更多