让我们说我想拥有存储整数或nils的数组od数据。例如:
[1,2,3,nil,5,nil,7]
如何使用选项? 当我玩它时总是最终得到:
[optional(1),optional(2)...]
我无法强制解包,因为只要值为零,它就会崩溃。
如果发生这种情况,如何迭代值并将未包装的值和nils添加到数组中?
答案 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