下面的代码给我一个错误。有没有办法简单地让这个返回 nil?
var testArray: [Int]?
testArray = [1,2,3]
testArray?[9]
最佳答案
这里有 3 种可能的东西你可能会混淆:
- 数组的可选项——即可能包含整数数组的变量:
[Int]?
- 可选数组——即包含可能为整数的变量的数组:
[Int?]
- 返回可选值的下标,因为下标可能无效 - 也就是说,如果索引有效,下标可能返回整数:
subscript(index) -> Int?
。
您在示例中得到的是第一种情况——数组的可选值。也就是说,要么 testArray
为 nil
,要么它是一个包含零个或多个元素的有效数组。
要访问可选项中的任何内容,您必须先打开它。您可以使用 !
强制展开它(尽量不要这样做,除非您有一个真的很好的理由——不,不是那个原因。也不是那个原因)。或者您可以使用 if let
或使用 ?
、?.
、?? 等运算符之一有条件地解包它。
等。在这种情况下,testArray?[9]
表示,“如果 testArray 是 nil
,则 nil
,否则 {Some whatever is at position 9}
。但是位置 9 没有值——这只是一个 3 元素数组。所以你得到一个运行时断言。
(另一种编写 testArray?[9]
的方式是 testArray.map { $0[9] }
,其中数组在 block 内展开并有效,但如果它是 nil
,则该 block 永远不会被执行。但结果仍然是您尝试访问数组的第 9 个元素,这是不允许的,并且您会遇到运行时错误)
第二种情况,一个可选整数数组,意味着您可以访问 testArray[1]
并且您会返回 {Some 2}
,因为数组包含可选项。但是同样,您无法访问第 9 个元素,因为没有第 9 个元素。
最后,第三种情况是调用 subscript 返回一个可选值,如果它不是有效索引,则返回一个 nil
。这似乎是你所期待的。 Swift 数组不会这样做。如果您按键查找,Swift 词典可以。如果键有值,你会得到 {Some value}
,如果没有,你会得到 nil
。简而言之,字典包含稀疏数据,而数组包含密集数据。
如果您有兴趣,我写了关于 pro 的帖子和 anti使数组从下标返回可选值的参数。但是现在,就像其他答案所说的那样,您必须在访问元素之前检查您的边界。您可能想尝试一些辅助方法,例如 first
、last
、find
以及 map
和filter
等,而不是直接访问元素,因为这可以解决许多问题。
(另一个值得思考的有趣的事情——上面的所有 3 种情况都可以组合在一起。所以你可以有一个可选的可选字典,当你访问它时它返回可选。如果你仍然对这一切感到困惑,试试玩在 Playground 上玩:)
关于arrays - Swift 可选数组索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27609430/