swift 为什么字典返回一个可选的,但数组不?

b1uwtaje  于 2023-03-22  发布在  Swift
关注(0)|答案(1)|浏览(104)

对于Array,如果你试图访问数组现有边界之外的索引,它将触发运行时错误。但是,如果你试图访问不存在的Dictionary键,你将得到'nil'(可选)。为什么Array不能做同样的事情?
我正在试图理解为什么字典返回选项而数组不返回?

bqf10yzr

bqf10yzr1#

你可以在官方Swift Evolution仓库的“Commonly Rejected Proposals”文档中找到官方答案:

  • 更改Array<T>下标访问以返回T?T!而不是T:当前的数组行为是intentional,因为它准确地反映了越界数组访问是逻辑错误这一事实。更改当前行为将使Array访问变慢到无法接受的程度。更改未标记的数组下标以返回可选项以前已经出现过multiple次,并且不太可能被接受。

这个“intentional”链接指向了2015年12月由Dave Abrahams发布的Swift邮件列表帖子(转换为Swift论坛帖子),Dave Abrahams是Swift标准库旧版本的主要实现者之一:
谢谢你,布伦特;它准确地抓住了基本原理。唯一缺少的是性能部分:允许阵列在超出范围的访问时做除中止之外的任何事情将使它们与C阵列没有竞争力。
在这里,戴夫支持Becca(以前是布伦特)Royal-Gordon的一篇文章,其中说:
但是,数组和字典的用例是不同的。
我想说,在给数组下标的时候,大约有80%的情况下,你使用的索引是从数组派生出来的,例如,像0..<array.countarray.indicesarray[indexPath.row]这样的范围,其中tableView(_:numberOfRowsInSection:)返回array.count。这与字典非常不同,其中键通常是来自其他地方的某个数据,你试图查找与之对应的值。你很少说,例如,array[2]array[someRandomNumberFromSomewhere],但dictionary[“myKey”]dictionary[someRandomValueFromSomewhere]是很常见的。
因为用例不同,数组有一个非可选的下标,当索引无效时,它会失败一个前提条件,而字典有一个可选的下标,当索引无效时,它会返回nil。

相关问题