展开可选后如何存储零值?

时间:2016-08-29 14:43:31

标签: ios swift

让我们说我想拥有存储整数或nils的数组od数据。例如:

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

如何使用选项? 当我玩它时总是最终得到:

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

我无法强制解包,因为只要值为零,它就会崩溃。

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

4 个答案:

答案 0 :(得分:1)

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

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

而不是:

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

您可以使用for循环检查每个元素是否为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)

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

答案 1 :(得分:0)

你的问题没有意义。您存储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]

答案 2 :(得分:0)

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

你使用一系列可选项,因为就像你说的那样,即使你不知道某些东西是Int还是Optional。循环遍历数组并尝试使用let展开,然后执行您需要执行的操作。使[Optional(1),Optional(2)...]是正确的,因为[1,nil,2,nil,3]实际上是一个可选Ints(Int?)数组,并且数组必须具有某个类型声明。

答案 3 :(得分:-1)

你可以这样做,

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