如何在Swift中从数组中删除给定值的元素

如何在Swift中从数组中删除给定值的元素,swift,Swift,我想从包含x、y和z元素的数组中删除值为x的所有元素 let arr = ['a', 'b', 'c', 'b'] 如何从arr中删除值“b”的所有元素?A筛选器: let farray = arr.filter {$0 != "b"} 一般的方法是利用第一类过程。(然而,这种方法比你的问题所需要的功能要强大得多。)举例来说,你想避免在许多集合中重复出现“Justin” let avoidJustin = notEqualTester ("Justin") let arrayOfUse

我想从包含x、y和z元素的数组中删除值为x的所有元素

let arr = ['a', 'b', 'c', 'b']
如何从arr中删除值“b”的所有元素?

A筛选器:

 let farray = arr.filter {$0 != "b"} 

一般的方法是利用第一类过程。(然而,这种方法比你的问题所需要的功能要强大得多。)举例来说,你想避免在许多集合中重复出现“Justin”

let avoidJustin = notEqualTester ("Justin")

let arrayOfUsers = // ...

arrayOfUsers.filter (avoidJustin)

let arrayOfFriends = // ...

arrayOfFriends.filter (avoidJustin)
这样,您就可以避免每次想要避开Justin时重复创建闭包。这里是
notEqualTester
,给定
that
,它返回一个
this
函数,该函数返回
this!=那

func notEqualTester<T: Equatable> (that:T) -> ((this:T) -> Bool) {
  return { (this:T) -> Bool in return this != that }
}
func notEqualTester(that:T)->((this:T)->Bool){
return{(this:T)->Bool作为回报this!=that}
}
this
的返回闭包捕获了
that
的值,当
that
不再可用时,该闭包非常有用

var array : [String]
array = ["one","two","one"]

let itemToRemove = "one"

while array.contains(itemToRemove) {
    if let itemToRemoveIndex = array.index(of: itemToRemove) {
        array.remove(at: itemToRemoveIndex)
    }
}

print(array)

适用于Swift 3.0。

Swift 3中,我只需执行以下操作:

arr = arr.filter { $0 != "a" } 
.filter、.sort和.map非常有助于节省时间并用少量代码解决许多问题


这篇文章有很好的例子,并解释了它们之间的区别以及它们是如何工作的:

根据评论编辑的

我喜欢这种方法:

var arr = ["a", "b", "c", "b"]

while let idx = arr.index(of:"b") {
    arr.remove(at: idx)
}
原始答案(编辑前):


如果需要修改初始数组,可以使用Swift 4.2/Xcode 10中提供的函数
removeAll(其中:)

var arr = ["a", "b", "c", "b"]
arr.removeAll(where: { $0 == "b" })
print(arr) // output is ["a", "c"]

但是,如果您使用的是Xcode 9,您可以在中找到此函数(此库提供了Xcode 10中一些新函数的实现)。

如果您有多个元素要删除,请参阅第一个答案

 var mainArray = ["a", "b", "qw", "qe"]
 let thingsToRemoveArray = ["qw", "b"] 


        for k in thingsToRemoveArray {
            mainArray =  mainArray.filter {$0 != k}
          }

你甚至不需要大括号,因为它是一个尾随闭包:)arr=arr.filter{$0!='b'}只是指出关于上面的注释,没有大括号编译器会抛出“匿名闭包参数不包含在闭包中”她/他指的是括号,不是带swift两个的大括号,你不能使用
,你需要使用
。因此,答案将是
let something=arr.filter{$0!=“b”}
我无法确定这一行是否非常清晰。虽然这段代码有点马虎,但它比
过滤器快了大约45%
solution@AaronBrager我刚刚做了测试,它比
过滤器
慢了10%。我想这样比较没有多大意义,因为结果在很大程度上取决于要删除的项在源数组中的频率和分布是否均匀。@EricD。是的,我同意这取决于源阵列(我使用了问题中的那个)这里是我的测试-
过滤器
从来没有更快过,我想这取决于你有多在乎你试图删除的值是否不存在,以及如果该值在数组上不存在,你是否想做些什么,不需要使用
包含
索引(of:)
。只使用索引(of)会快得多,因为它返回一个可选的。请注意,这将只删除等于“b”的第一个数组元素。若要删除所有属性(如本问题所需),请将
if
替换为
while
。请注意,arr声明为常量,不能对其使用变异方法。顺便说一句,数组声明中使用的单引号语法是错误的。Martin和Leo都是正确的。谢谢你的指点。我已经编辑了答案。我一定从未尝试过,因为常量声明甚至不应该编译。我的错。
 var mainArray = ["a", "b", "qw", "qe"]
 let thingsToRemoveArray = ["qw", "b"] 


        for k in thingsToRemoveArray {
            mainArray =  mainArray.filter {$0 != k}
          }