为什么 Swift 中的数组索引不返回可选值?

tec*_*nic 4 arrays indexing swift swift4

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

对 的数组进行索引时[Any],结果类型为Any,并且调用可能会引发致命错误。

这种差异有什么原因吗?

guard let使用、if let?和 来分支执行真是太好了??,但是您必须将数组索引包装在if data.count <= index.

Ale*_*ica 8

最终是出于性能原因:

通常被拒绝的变更

...

字符串、字符和集合类型

  • Array<T>下标访问返回T?orT!代替T:当前的数组行为是有意为之的,因为它准确地反映了越界数组访问是一个逻辑错误的事实。改变当前的行为会将Array访问速度减慢到不可接受的程度。这个话题以前曾多次出现过,但不太可能被接受。

https://github.com/apple/swift-evolution/blob/master/commonly_propose.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 = array[safelyIndex: 3]
print(n as Any) // => Optional(3)
Run Code Online (Sandbox Code Playgroud)