对于数组,如果尝试访问数组现有边界之外的索引,将会触发运行时错误。但是,如果您尝试访问不存在的字典键,您将得到“nil”(可选)。为什么数组不能做同样的事情?
我想理解为什么字典返回选项而数组不返回?
您可以在\xe2\x80\x9cCommonly Rejected Proposals\xe2\x80\x9d 文档中找到官方答案,该文档是官方 Swift Evolution 存储库的一部分:
\n\n\n\n
\xe2\x80\x9cintentional\xe2\x80\x9d 链接指向 Dave Abrahams 于 2015 年 12 月发布的 Swift 邮件列表帖子(已转换为 Swift 论坛帖子),Dave Abrahams 是 Swift 标准库旧部分的主要实现者之一:
\n\n\n谢谢你,布伦特;这准确地抓住了基本原理。缺少的一件事是性能部分:允许数组执行除超出范围访问时中止之外的任何操作将使它们与 C 数组不具有竞争性。
\n
在此,戴夫赞同贝卡(原布伦特)罗亚尔-戈登的一篇文章,其中写道:
\n\n\n不过,数组和字典的用例是不同的。
\n我\xe2\x80\x99d说大约80%的时候你下标一个数组,你\xe2\x80\x99正在使用一个以某种方式从数组\xe2\x80\x94派生的索引,例如,像
\n0..<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]因为用例不同,数组有一个非可选下标,当索引无效时,它会失败前提条件,而字典有一个可选下标,当索引无效时,它会返回 nil。
\n