arrays - Swift 可选数组索引错误

标签 arrays swift option-type

下面的代码给我一个错误。有没有办法简单地让这个返回 nil?

var testArray: [Int]?

testArray = [1,2,3]

testArray?[9]

最佳答案

这里有 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 元素数组。所以你得到一个运行时断言。

(另一种编写 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使数组从下标返回可选值的参数。但是现在,就像其他答案所说的那样,您必须在访问元素之前检查您的边界。您可能想尝试一些辅助方法,例如 firstlastfind 以及 mapfilter 等,而不是直接访问元素,因为这可以解决许多问题。

(另一个值得思考的有趣的事情——上面的所有 3 种情况都可以组合在一起。所以你可以有一个可选的可选字典,当你访问它时它返回可选。如果你仍然对这一切感到困惑,试试玩在 Playground 上玩:)

关于arrays - Swift 可选数组索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27609430/

相关文章:

Javascript 按索引比较 2 个数组,而不是按 2 个数组共有的值总数

swift - 识别触摸时点击的立方体的面开始于 Swift - SceneKit

ios - FBSDKApplicationDelegate 没有名为 "application"的成员

json - 忽略不支持的解码器

php - Mysql/PHP 查询包含保留字的表值

c++ - ideone 和 codeblocks 中相同输入的不同输出(小阶乘)

c - 为什么不能使静态数组的大小可变?

ios - 如何在 1 项选项卡栏 Controller 内制作顶部选项卡以快速显示多个 View Controller ?

ios - 具有 bool 值的字典的 Swift 优雅条件

java - Optional<T> 用于方法的输入参数