我试图从字符串数组的后面删除""
和" "
,直到最后一项包含一些文本,但我的实现没有拿起" "
。
到目前为止我的实施:
var array = ["A", "B", "", "C", "D", " ", " ", ""]
while true {
if (array.last == " " || array.last == "") {
array.removeLast()
} else {
break
}
}
我想要的输出是["A", "B", "", "C", "D"]
,但......
我目前的输出是["A", "B", "", "C", "D", " ", " "]
,在遇到while
后,breaks
循环只是" "
任何建议为什么它没有拿起" "
?
谢谢。
解决这个问题的一种方法是反转收集(懒得完成)并丢弃不需要的物品,直到遇到想要的物品。然后,再次反转收集。
let array = ["A", "B", "", "C", "D", " ", " ", ""]
let filtered = array.reversed().drop(while: {
$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
}).reversed() as [String]
print(filtered) // "["A", "B", "", "C", "D"]\n"
请注意,如果" "
不是正常空间,则检查可能会失败,例如非中断空格(Unicode检查点U + 00A0)。这可能是您首先遇到的问题。因此修剪字符串(它只从开始和结束中删除字符)并检查结果是否为空字符串。
将您的状况移至while
并确保在操作后检查正确的阵列。
var array = ["A", "B", "", "C", "D", " ", " ", ""]
while array.last == " " || array.last == "" {
array.removeLast()
}
print(array) // ["A", "B", "", "C", "D"]
只是为了好玩,让我们以通用的方式扩展Array
这个功能,同时从外部提供更灵活的条件。
类似于Array
s有drop(while:)
,我们可以像这样制作一个dropLast(while:)
:
extension Array {
func dropLast(while handler: (Element)->Bool) -> Array {
var array = self
while let last = array.last, handler(last) {
array.removeLast()
}
return array
}
}
let array = ["", "A", "B", "", "C", "D", " ", " ", ""]
let modified = array.dropLast { $0.trimmingCharacters(in: .whitespaces).isEmpty }
print(modified) //["", "A", "B", "", "C", "D"]
它也可以处理其他类型的数组,并且由于条件没有融入功能,因此它具有灵活性和可重用性。
let array = [0, 1, 2, 3, 0, 5, 6, 7, 0, -1, 0, -2]
//Drop (from tail) all numbers less than 1
let modified = array.dropLast(while: { (val) -> Bool in
return val < 1
})
print(modified) //[0, 1, 2, 3, 0, 5, 6, 7]
基本上你的解决方案很好。但你可以使它更通用的“”,“
”,“”,“
”,....:
import Foundation
var array = ["A", "B", "", "C", "D", " ", " ", ""]
while true {
let shouldRemoveLast = array.last?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ?? false
if (shouldRemoveLast) { array.removeLast() } else { break }
}