Arrays 初学者:当使用数组时,为什么这个可以工作而不是这个?

Arrays 初学者:当使用数组时,为什么这个可以工作而不是这个?,arrays,swift,Arrays,Swift,带有colorsArray.last的一个可以工作,但带有下标语法的一个不行,例如,colorsArray[2]。如果你能帮我理解这一点,那就太好了。我正在自学斯威夫特,所以我来这里回答我的问题 let colorsArray = ["Red", "Green", "Blue"] if let method2 = colorsArray.last { print(method2) } if let method2 = colorsArray[2] { print(meth

带有
colorsArray.last
的一个可以工作,但带有下标语法的一个不行,例如,
colorsArray[2]
。如果你能帮我理解这一点,那就太好了。我正在自学斯威夫特,所以我来这里回答我的问题

let colorsArray = ["Red", "Green", "Blue"]


if let method2 = colorsArray.last {
    print(method2)
}


if let method2 = colorsArray[2] {
    print(method2)
}

问题是,对于数组,下标运算符不返回,因此使用像
if let
这样的展开构造来展开它是没有意义的

尝试
让foo=colorsArray[42]
,其中索引超出范围。它不会返回
nil
,而是会因“下标超出范围”错误而崩溃。如前所述(重点加上):

使用
first
last
属性可以安全访问数组的第一个和最后一个元素的值。如果数组为空,则这些属性为
nil

可以通过下标访问单个数组元素。非空数组的第一个元素总是在索引0处。可以使用从零到(但不包括)数组计数的任何整数为数组下标。使用负数或等于或大于count的索引会触发运行时错误


因此,
last
提供了安全访问,返回一个可选的,但是subscript操作符不返回一个可选的,但是如果您提供了无效的索引,也不提供安全访问。

last
不同,按索引订阅数组的结果不是可选的

let method2 = colorsArray[2]
print(method2)

原因很可能是ObjC兼容性,缺点是如果索引不存在,它会抛出一个异常,也就是崩溃。

如果您查看文档,您会发现当您使用Api
last
时,返回类型是可选的,因此您可以使用可选绑定来安全地打开值。但是,如果您像在第二种情况下那样通过索引访问元素,则会得到未包装的值,并且编译器假定如果您这样访问,肯定会有一个值。但请记住,如果数组大小小于要传递的索引,则可能会导致数组索引的错误超出范围。

我认为这不是兼容性问题。这只是预期的行为。是的,这不是兼容性,而是性能优化。