为什么字典返回可选值,而数组则不返回可选值?

Wal*_*r M 0 swift

对于数组,如果尝试访问数组现有边界之外的索引,将会触发运行时错误。但是,如果您尝试访问不存在的字典键,您将得到“nil”(可选)。为什么数组不能做同样的事情?

我想理解为什么字典返回选项而数组不返回?

rob*_*off 7

您可以在\xe2\x80\x9cCommonly Rejected Proposals\xe2\x80\x9d 文档中找到官方答案,该文档是官方 Swift Evolution 存储库的一部分:

\n
\n
    \n
  • 将下标访问更改Array<T>为 return T?orT!而不是T:当前的数组行为是有意为之,因为它准确地反映了越界数组访问是逻辑错误的事实。改变当前的行为会将Array访问速度减慢到不可接受的程度。更改未标记的数组下标以返回可选值已出现多个,并且不太可能被接受。
  • \n
\n
\n

\xe2\x80\x9cintentional\xe2\x80\x9d 链接指向 Dave Abrahams 于 2015 年 12 月发布的 Swift 邮件列表帖子(已转换为 Swift 论坛帖子),Dave Abrahams 是 Swift 标准库旧部分的主要实现者之一:

\n
\n

谢谢你,布伦特;这准确地抓住了基本原理。缺少的一件事是性能部分:允许数组执行除超出范围访问时中止之外的任何操作将使它们与 C 数组不具有竞争性。

\n
\n

在此,戴夫赞同贝卡(原布伦特)罗亚尔-戈登的一篇文章,其中写道:

\n
\n

不过,数组和字典的用例是不同的。

\n

我\xe2\x80\x99d说大约80%的时候你下标一个数组,你\xe2\x80\x99正在使用一个以某种方式数组\xe2\x80\x94派生的索引,例如,像0..<array.count, 或array.indices,或array[indexPath.row]返回.tableView(_:numberOfRowsInSection:)这与字典有很大不同,字典中的键通常是来自其他array.count地方的某些数据,而您\xe2\x80\x99 正在尝试查找与其相对应的值。例如,你很少说“或” ,但“或”却很常见。array[2]array[someRandomNumberFromSomewhere]dictionary[\xe2\x80\x9cmyKey\xe2\x80\x9d]dictionary[someRandomValueFromSomewhere]

\n

因为用例不同,数组有一个非可选下标,当索引无效时,它会失败前提条件,而字典有一个可选下标,当索引无效时,它会返回 nil。

\n
\n