首页 > 解决方案 > 为什么 Swift 中的数组索引不返回可选值?

问题描述

访问字典时,例如 [String:Any],结果类型为 Optional(Any)。

索引 [Any] 的数组时,结果类型为 Any,调用会抛出致命错误。

这种差异有什么原因吗?

使用保护 let、if let、? 和 ?? 分支执行会非常好,但是您必须将数组索引包装在 if data.count <= index 中。

标签: arraysswiftindexingswift4

解决方案


最终是出于性能原因:

常被拒绝的变更

...

字符串、字符和集合类型

  • Make Array<T>subscript access return T?or T!instead of T:当前数组行为是有意的,因为它准确地反映了越界数组访问是一个逻辑错误的事实。更改当前行为会使Array访问速度减慢到无法接受的程度。这个话题之前已经出现过多次,但不太可能被接受。

https://github.com/apple/swift-evolution/blob/master/commonly_proposed.md#strings-characters-and-collection-types

虽然没有什么能阻止你自己动手:

extension Collection {
    subscript(safelyIndex i: Index) -> Element? {
        get {
            guard self.indices.contains(i) else { return nil }
            return self[i]
        }
    }
}

let array = Array(0...10)
let n = [safelyIndex: 3]
print(n as Any) // => Optional(3)

推荐阅读