Nat*_*ann 3 arrays optional swift
下面的代码给了我一个错误.有没有办法简单地让这个回报为零?
var testArray: [Int]?
testArray = [1,2,3]
testArray?[9]
Run Code Online (Sandbox Code Playgroud)
这里有3种可能的东西你可能会混淆:
[Int]?[Int?]subscript(index) -> Int?.你的例子中你得到的是第一种情况 - 可选的数组.也就是说,要么是,要么testArray是nil包含零个或多个元素的有效数组.
要访问可选内部的任何内容,您必须首先打开它.你可以强行解开它!(除非你有一个非常好的理由,否则不要这样做- 不是没有那个原因.不是也不是那个).或者你也可以有条件地解开它,或者使用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.对此的简写理由是字典包含稀疏数据,而数组包含密集数据.
如果你有兴趣,我会写关于pro和anti参数的帖子,以使数组从下标返回选项.但就目前而言,正如其他答案所说,你必须在访问元素之前检查你的界限.你可能会想尝试一些辅助方法一样first,last,find,以及map和filter等,而不是直接访问元素,这使得许多这样的问题消失.
(另一个有趣的事情要考虑 - 上面的所有3个案例都可以组合在一起.所以你可以有一个可选的可选词典,当你访问它时返回选项.如果你仍然对这一切都很朦胧,那试试吧在操场上:)