为什么字典返回可选值,而数组不返回?

问题描述 投票:0回答:1

对于数组,如果您尝试访问数组现有边界之外的索引,则会触发运行时错误。但是,如果您尝试访问不存在的字典键,您将得到一个“nil”(可选)。为什么 Array 不能做同样的事情?

我试图理解为什么字典返回可选值而数组不返回?

swift
1个回答
0
投票

来自docs

每个数组都保留特定数量的内存来保存其内容。当您向数组添加元素并且该数组开始超出其保留容量时,该数组会分配更大的内存区域并将其元素复制到新存储中。新存储是旧存储大小的倍数。

所以数组有固定大小的内存。 此大小基于构成数组的元素的类型。这就是数组只能容纳一种类型的原因。 只有当你添加元素时,Swift 才能动态创建一个新元素。然而,当访问一个元素时,你基本上要求访问一个特定的内存地址:并返回它的内容

在这种情况下抛出错误,就像大多数 OOP 语言所做的那样:是故意的。因为当程序试图访问不存在或不属于程序的内存位置时,它被视为运行时错误。

但是,字典被认为是一种注册表(哈希图)。它没有内存的顺序计算,访问元素不是基于存储元素大小的顺序计算。刚刚使用名称(键)引用的元素和存储的元素始终是相同的类型:地址! 所以基本上,当您尝试访问字典的元素时:您实际上并没有要求内存地址的内容,而只是要求元素 X 的内存。 X 可以在注册表中引用或不引用。但是在这种情况下抛出错误在运行时方面是无稽之谈:除非您为此定义自定义异常(可能是缺少元素异常)。

所以通过返回“nil”,Swift 表示:我在我的注册表中找不到任何具有此名称的 Objective-C 有效对象。这是一个逻辑访问。没有明显的理由抛出任何错误。

© www.soinside.com 2019 - 2024. All rights reserved.