【问题标题】:How to store nil value after unwrapping optional? [closed]展开可选后如何存储零值? [关闭]
【发布时间】:2016-08-30 04:07:26
【问题描述】:

假设我想要存储整数或 nil 的数组 od 数据。例如:

[1,2,3,nil,5,nil,7]

如何使用选项来做到这一点? 当我玩它时,结果总是:

[optional(1),optional(2)...]

我不能强制解包,因为它会在值恰好为 nil 时崩溃。

如果发生这种情况,如何迭代值并将展开的值和 nils 添加到数组中?

【问题讨论】:

  • 你可以使用flatMap stackoverflow.com/a/32876707/2227743
  • 所以......你想print这样的数组:[1,2,3,nil,5,nil,7],而不是这个:[optional(1),optional(2)...]。我没听错吗?
  • 这正是我想要做的。因为我需要跟踪哪个值是 nil
  • "将未包装的值和 nil 添加到数组中" 数组不能同时包含未包装的值和 nil。如果它可以包含 nil,它必须完全由 Optionals 组成。只有当这是 [Int?](包装 Int 的选项数组)并且 1 实际上是 Optional(1) 等等时,您的 [1,2,3,nil,5,nil,7] 才可能。

标签: ios swift


【解决方案1】:

正如您在 cmets 中所说,您希望以这种格式打印数组:

[1, 2, 3, nil, 5, nil, 7]

而不是这个:

[Optional(1), Optional(2), Optional(3), nil, Optional(5), nil, Optional(7)]

您可以使用 for 循环来检查每个元素是否为 nil。如果是 nil,则打印“nil”,否则,打开并打印数字。

但是这样写的代码太多了,不是吗?您必须处理逗号和[] 的位置。所以我想出了这个小技巧......不过你可能不喜欢它:

final class Nil: CustomStringConvertible {
    var description: String = "nil"
}

let a: [Int?] = [1, 2, 3, nil, 5, nil, 7] // this is your original array
let b: [AnyObject] = a.map { $0 as AnyObject? ?? Nil() }
print(b)

我承认这并不干净,但我的意思是,它毕竟是更少的代码。

【讨论】:

    【解决方案2】:

    你的问题没有意义。您存储 nil 以便能够拥有“空”元素。因此,无论如何,您都需要检查每个元素是否有 nil

    只需遵循众所周知的可选绑定模式:

    var array: [Int?] = [1,2,3,nil,5,nil,7]
    if let element = array[3] {
        //do smtng
    }
    

    或删除所有nil

    let nilFree = array.flatMap{$0}
    //[1,2,3,5,7]
    

    Array<Optional<T>> 的自定义打印示例:

    print(array.map {nullable -> AnyObject in return nullable ?? "nil"})
    //[1, 2, 3, nil, 5, nil, 7]
    

    【讨论】:

    • 我要存储空元素,就是这样
    • @DCDC 使用选项。当您对此有疑问时,请提供真实案例。此外,请尝试考虑您希望构建的数组类型。
    • 假设我需要精确的 10 个元素数组,展开后我需要知道值和 nil 出现的位置
    • @DCDC 假设我需要精确的 10 个元素数组,展开后我需要知道值和 nil 出现的位置 - 要通过数组中的每个元素进行此循环,请使用条件展开对于条件展开期间数组的每个元素,您将知道数组的哪个索引具有值以及数组的哪个索引具有 nil。
    【解决方案3】:

    您已经回答了自己的问题,但不太清楚为什么您已经正确了。

    您使用了一个可选数组,因为正如您所说,即使您不知道某个东西是 Int 还是 Optional。循环遍历数组并尝试使用let 解包,然后执行您需要执行的任何操作。拥有 [Optional(1), Optional(2)...] 是正确的,因为[1,nil,2,nil,3] 实际上是一个可选 Int (Int?) 的数组,并且数组必须具有特定的类型声明。

    【讨论】:

      【解决方案4】:

      你可以这样做,

      var optionalIntArray: [Int?]
      optionalIntArray = [1, 2, 3, nil, 4, 5]
      

      当你使用 print() 打印数组时,你会看到它是这样的,

      [optional(1),optional(2)...]
      

      这是正确的输出,因为您的数组应该包含可选的 int,它将表示为

      可选(1)

      对于整数可选值 1。

      如果您想遍历 optionalIntArray 并仅添加未包装的值,请在数组上使用 flatMap(),例如,

      let arrayContainingUnwrappedValues = optionalIntArray.flatMap{$0}
      arrayContainingUnwrappedValues
      

      【讨论】:

        猜你喜欢
        • 2013-11-07
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多