Swift可选数组索引错误

Nat*_*ann 3 arrays optional swift

下面的代码给了我一个错误.有没有办法简单地让这个回报为零?

var testArray: [Int]?

testArray = [1,2,3]

testArray?[9]
Run Code Online (Sandbox Code Playgroud)

Air*_*ity 7

这里有3种可能的东西你可能会混淆:

  1. 数组的可选项 - 即可能包含整数数组的变量: [Int]?
  2. 一个可选项数组 - 也就是说,包含可能是整数的变量的数组: [Int?]
  3. 返回可选的下标,因为该下标可能无效 - 也就是说,如果索引有效,则可能返回整数的下标:subscript(index) -> Int?.

你的例子中你得到的是第一种情况 - 可选的数组.也就是说,要么是,要么testArraynil包含零个或多个元素的有效数组.

要访问可选内部的任何内容,您必须首先打开它.你可以强行解开它!(除非你有一个非常好的理由,否则不要这样做- 不是没有那个原因.不是也不是那个).或者你也可以有条件地解开它,或者使用if let,或者使用类似的运营商之一?,?.,??等.在这种情况下,testArray?[9]意味着,"如果testArray是nil,那么nil,否则{Some whatever is at position 9}但有9位没有价值-这只是一个3 -element数组.所以你得到一个运行时断言.

(另一种写入testArray?[9]方式是testArray.map { $0[9] },在块内部,数组被解包并且有效,但是如果它是nil块永远不会被执行.但结果仍然是你试图访问数组的第9个元素,并且这是不允许的,你得到一个运行时错误)

第二种情况,一个可选整数数组,意味着你可以访问testArray[1]并返回{Some 2},因为数组包含选项.但同样,你无法访问第9个元素,因为没有第9个元素.

最后,第三种情况是调用下标给你一个可选值,如果它不是一个有效的索引,你会得到一个nil.这似乎是你所期待的.Swift数组会这样做.如果你按键查找,那么Swift词典就可以了.如果密钥有值,则返回{Some value},如果没有,则得到nil.对此的简写理由是字典包含稀疏数据,而数组包含密集数据.

如果你有兴趣,我会写关于proanti参数的帖子,以使数组从下标返回选项.但就目前而言,正如其他答案所说,你必须在访问元素之前检查你的界限.你可能会想尝试一些辅助方法一样first,last,find,以及mapfilter等,而不是直接访问元素,这使得许多这样的问题消失.

(另一个有趣的事情要考虑 - 上面的所有3个案例都可以组合在一起.所以你可以有一个可选的可选词典,当你访问它时返回选项.如果你仍然对这一切都很朦胧,那试试吧在操场上:)