说我有一个Int
s的数组。
var nums = [5, 4, 3, 2, 1]
var maybeNum: Int?
nums.append(maybeNum)
但这会导致错误。我是否真的必须检查它是否有值,并且仅在插入时才插入它?
答案 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 }