为啥数组越界抛异常而字典确不会?

作者: 八条8tiao | 来源:发表于2016-07-24 12:06 被阅读512次

数组遭受了不平等对待吗?

在我们访问数组的时候,如果发生了越界,那么我们一定会收到错误。以swift语言为例。

let array = [1,2,3]
array[10] // error !!!!!!!!!

数组中只包含三个元素,但我们用下标10去访问,发生越界错误。

但是当我们访问一个不在字典中的元素的时候,确不会发生类似的情况!

let dic = ["a": 1, "b": 2]
dic["z"]  // 虽然不存在,但不会出现异常

同样的问题,不同的待遇,这是为啥呢?

究其原因

我们来查看一下swift中数组和字典下标访问的实现。

struct Array<Element> {
    subscript(index: Int) -> Element
}

struct Dictionary<Key: Hashable, Value> {
    subscript(key: Key) -> Value?
}

比较两者的实现,我们可以得到问题的原因:

  • 数组下标访问返回的不是一个optional类型
  • subscript方法无法throw错误

所以对于数组而言,swift除了弄个fatalError以外,没有其它的替代方案了。而字典返回的是optional类型值,如果发生什么意外状况,即使subscript不能throw errors,字典也可以悠然的返回一个nil。

让我们定义另个版本

其实我们可以给数组做一个扩展,实现一个即使数组访问越界也不会抛异常的版本。

extension Array {
    subscript(safe index: Int) -> Element? {
        return index >= 0 && index < count ? self[index] : nil
    }
}

我们使用 extension 关键字来给Array做一个扩展,要注意的是:我们无法覆盖原有的subscript方法,

注意:subscript方法是可以被重载的,也就是说允许同时有多个subscript方法存在

我们只增加一个新的subscript方法,并明确指定一个外部参数就可以了,我们现在可以这样访问数组了。

var array = [1,2,3]
array[safe: 10] // 返回nil,而不是异常

我们需要在下标访问的时候增加一个label,这个时候虽然我们越界了,但我们却像字典那样,收获了一个nil。

本文的目的是讨论一下字典与数组下标实现的区别以及subscript的一些特点:不可throw,可以重载等
但绝对不是在说数组越界后应该不应该抛出异常。抛不抛出异常要从数组的数据结构应用场景等多方面考虑。

相关文章

  • 为啥数组越界抛异常而字典确不会?

    数组遭受了不平等对待吗? 在我们访问数组的时候,如果发生了越界,那么我们一定会收到错误。以swift语言为例。 数...

  • jvm如何处理抛异常

    抛异常显式:代码加 throw隐式:jvm运行时,无法正常执行,如数组索引越界 捕获异常try:需要进行异常监控...

  • 13 数组常见问题

    数组索引越界异常 空指针异常

  • 学习OC

    1.数组越界,字典取空问题解决 实现一个数组或者字典的扩展方法,判断数组或者字典是否为空或者越界,如果是返回对象,...

  • iOS奔溃信息类型捕捉与分析

    iOS 异常奔溃类型分类 1.数组越界导致的崩溃 2.数据集合类型,如字典、数组中插入元素时,插入空指针nil 3...

  • 异常——java学习之⑨

    1,常见异常 ArrayIndexOutOfBoundsException,数组下标越界异常 NullPointe...

  • iOS常见的崩溃

    数组越界 字面量数组和字典插入nil值 字典 Unrecognized Selector NaN崩溃 富文本初始化...

  • Java异常处理

    1. 异常概述 1.1 常见异常 异常名作用IndexOutOfBoundException数组越界异常Numbe...

  • 防止崩溃

    非字典转模型 数组越界 子线程刷UI 崩溃日志打印

  • NO.33 数组操作的两个常见小问题越界和空指针

    数组索引越界异常(ArrayIndexOutOfBoundsException) 原因:当访问的数组中没有访问的索...

网友评论

    本文标题:为啥数组越界抛异常而字典确不会?

    本文链接:https://www.haomeiwen.com/subject/umowjttx.html