在Swift中向可选数组添加元素

Sap*_*Sap 27 arrays swift

在可选数组的末尾附加元素的正确方法是什么?假设我有一个可选的数组myArray,我想在末尾附加'99'.Append()不适用于nil数组,因此我能找到的唯一解决方案如下,但它看起来并不优雅:

var myArray = [Int]?()

if myArray?.count > 0 {
    myArray?.append(99)
} else {
    myArray = [99]
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 53

您可以使用以下事实:通过可选链接调用的方法始终返回一个可选值,即nil如果无法调用该方法:

if (myArray?.append(99)) == nil {
    myArray = [99] 
}
Run Code Online (Sandbox Code Playgroud)

如果myArray != nil然后myArray?.append(99)追加新元素并返回Void,则不执行if块.

如果myArray == nil则不myArray?.append(99)执行任何操作并返回 nil,则执行if块并分配数组值.

  • 如果你想进行单线化:`(myArray?.append(c))?? (myArray = [c])`似乎有效.在它面前甚至不需要`_ =`. (5认同)
  • 哇,真的很酷!学到了新的东西. (4认同)

小智 7

我的一个衬垫使用零合并:

myArray = (myArray ?? []) + [99]
Run Code Online (Sandbox Code Playgroud)


Ant*_*nio 5

@MartinR 的答案正确的答案,但是,为了完整起见,如果您有一个可选项并且想要根据它是否为可选项执行不同的操作,您可以检查它是否为零(或不为零):

if myArray != nil {
    myArray?.append(99)
} else {
    myArray = [99]
}
Run Code Online (Sandbox Code Playgroud)

请注意(正如您可能已经发现的那样)可选绑定在您的情况下不起作用,因为数组是值类型:它会创建数组的副本,并向其附加一个新元素,而实际上不会影响原始数组:

// Wrong implementation - the new item is appended to a copy of myArray
if var myArray = myArray {
    myArray.append(99)
} else {
    myArray = [99]
}
Run Code Online (Sandbox Code Playgroud)