在我们访问数组的时候,如果发生了越界,那么我们一定会收到错误。以swift语言为例。
数组中只包含三个元素,但我们用下标10去访问,发生越界错误。
但是当我们访问一个不在字典中的元素的时候,确不会发生类似的情况!
同样的问题,不同的待遇,这是为啥呢?
我们来查看一下swift中数组和字典下标访问的实现。
比较两者的实现,我们可以得到问题的原因:
所以对于数组而言,swift除了弄个fatalError以外,没有其它的替代方案了。而字典返回的是optional类型值,如果发生什么意外状况,即使subscript不能throw errors,字典也可以悠然的返回一个nil。
其实我们可以给数组做一个扩展,实现一个即使数组访问越界也不会抛异常的版本。
我们使用 extension 关键字来给Array做一个扩展,要注意的是:我们无法覆盖原有的subscript方法,
我们只增加一个新的subscript方法,并明确指定一个外部参数就可以了,我们现在可以这样访问数组了。
我们需要在下标访问的时候增加一个label,这个时候虽然我们越界了,但我们却像字典那样,收获了一个nil。