是否有一个单行版本的“添加到数组,如果不是零,否则不要打扰”?

时间:2015-07-01 02:16:55

标签: swift

说我有一个Int s的数组。

var nums = [5, 4, 3, 2, 1]
var maybeNum: Int?
nums.append(maybeNum)

但这会导致错误。我是否真的必须检查它是否有值,并且仅在插入时才插入它?

6 个答案:

答案 0 :(得分:3)

首先,你必须打开' maybeNum,其类型为Int?。 解开后,num的类型为Int,可以将其附加到nums: [Int]

if let num = maybeNum {
    nums.append(num)
}

答案 1 :(得分:2)

您可以使用以下扩展程序:

extension Array {
    public mutating func append(_ newElement: Element?) {
        if let element = newElement {
            self.append(element)
        }
    }
}

这样,您仍然可以使用原始append方法。附加非可选元素时,将使用常规方法。附加可选元素时,将使用此方法,并且仅当元素不是nil时才会附加元素。

答案 2 :(得分:0)

您可以将nums设为可选Ints数组。

var nums = [Int?]()
nums = [5, 4, 3, 2, 1]
var maybeNum: Int?
nums.append(maybeNum)

但是,数组内部现在有一个nil元素。

另一种选择是:

var nums = [5, 4, 3, 2, 1]
var maybeNum: Int?
if maybeNum != nil {nums.append(maybeNum!)}

在一行中你想做什么。

答案 3 :(得分:0)

如果您向名为Int的{​​{1}}声明了扩展程序,那么只有当值不为nil时,您才可以利用可选链接来调用appendTo

appendTo

答案 4 :(得分:0)

你可以写一个像这样的扩展名:

extension ExtensibleCollectionType {
    mutating func maybeAppend(optional: Self.Generator.Element?) {
        if let x = optional {
            self.append(x)
        }
    }
}

然后像这样使用它:

var items = [ 1, 2, 3, 4, 5]
var maybeNumber: Int? 
self.maybeAppend(maybeNumber)

答案 5 :(得分:0)

这个问题我来晚了,但是使用compactMap()也可以选择。此方法将在数组的每个元素中调用传递给它的函数,然后从结果中排除 null 元素。因此,通过传递仅返回元素的函数,可以将类型为[Int?]的数组转换为[Int]

let onlyNumbers = [1, 2, 3, nil, 4].compactMap { $0 }