其他答案使用flatMap 来消除nil 元素,并需要调用joined() 来组合元素并添加逗号。
使用joined() 添加逗号当然是第二遍
大批。这是一种使用reduce 一次性完成此操作的方法:
let arr: [Int?] = [nil, nil, 1, 2, 3, nil, 4, nil, 5, nil]
let result = arr.reduce("") { $1 == nil ? $0 : $0.isEmpty ? "\($1!)" : $0 + ",\($1!)" }
print(result)
输出:
1,2,3,4,5
说明
本例使用reduce逐个元素构造结果字符串。
reduce 是在序列上调用的方法。它接受一个初始值(本例中为"")和一个闭包,该闭包将序列中的下一个元素与部分结果组合起来以创建下一个部分结果。
对序列中的每个元素调用闭包(即数组arr)。闭包首先检查元素是否为nil,如果是,则返回未修改的部分结果。如果元素不是nil,则检查部分结果是否仍然是空字符串。如果它为空,则这是结果中的第一个元素,因此它返回一个仅由该元素组成的字符串。如果部分结果不为空,它会将前面带有, 的新元素添加到部分结果中。
使用reduce(into:):
将其重写为使用 reduce(into:) 和 append 会导致生成最终逗号分隔字符串时的实现速度是其他答案的两倍。
let result = arr.reduce(into: "") { (string, elem) in
guard let elem = elem else { return }
if string.isEmpty {
string = String(elem)
} else {
string.append(",\(elem)")
}
}