对于Array,如果你试图访问数组现有边界之外的索引,它将触发运行时错误。但是,如果你试图访问不存在的Dictionary键,你将得到'nil'(可选)。为什么Array不能做同样的事情?我正在试图理解为什么字典返回选项而数组不返回?
bqf10yzr1#
你可以在官方Swift Evolution仓库的“Commonly Rejected Proposals”文档中找到官方答案:
Array<T>
T?
T!
T
Array
这个“intentional”链接指向了2015年12月由Dave Abrahams发布的Swift邮件列表帖子(转换为Swift论坛帖子),Dave Abrahams是Swift标准库旧版本的主要实现者之一:谢谢你,布伦特;它准确地抓住了基本原理。唯一缺少的是性能部分:允许阵列在超出范围的访问时做除中止之外的任何事情将使它们与C阵列没有竞争力。在这里,戴夫支持Becca(以前是布伦特)Royal-Gordon的一篇文章,其中说:但是,数组和字典的用例是不同的。我想说,在给数组下标的时候,大约有80%的情况下,你使用的索引是从数组派生出来的,例如,像0..<array.count、array.indices或array[indexPath.row]这样的范围,其中tableView(_:numberOfRowsInSection:)返回array.count。这与字典非常不同,其中键通常是来自其他地方的某个数据,你试图查找与之对应的值。你很少说,例如,array[2]或array[someRandomNumberFromSomewhere],但dictionary[“myKey”]或dictionary[someRandomValueFromSomewhere]是很常见的。因为用例不同,数组有一个非可选的下标,当索引无效时,它会失败一个前提条件,而字典有一个可选的下标,当索引无效时,它会返回nil。
0..<array.count
array.indices
array[indexPath.row]
tableView(_:numberOfRowsInSection:)
array.count
array[2]
array[someRandomNumberFromSomewhere]
dictionary[“myKey”]
dictionary[someRandomValueFromSomewhere]
1条答案
按热度按时间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.count
、array.indices
或array[indexPath.row]
这样的范围,其中tableView(_:numberOfRowsInSection:)
返回array.count
。这与字典非常不同,其中键通常是来自其他地方的某个数据,你试图查找与之对应的值。你很少说,例如,array[2]
或array[someRandomNumberFromSomewhere]
,但dictionary[“myKey”]
或dictionary[someRandomValueFromSomewhere]
是很常见的。因为用例不同,数组有一个非可选的下标,当索引无效时,它会失败一个前提条件,而字典有一个可选的下标,当索引无效时,它会返回nil。