如何从Swift中的数组中删除元素

我怎样才能在Apple的新语言Swift中取消设置数组中的元素?

这是一些代码:

let animals = ["cats", "dogs", "chimps", "moose"] 

元素animals[2]如何从arrays中移除?

let关键字用于声明不能更改的常量。 如果你想修改一个variables,你应该使用var来代替,例如:

 var animals = ["cats", "dogs", "chimps", "moose"] animals.remove(at: 2) //["cats", "dogs", "moose"] 

保持原始集合不变的非变异替代scheme是使用filter创build一个新的集合,而不需要删除要删除的元素,例如:

 let pets = animals.filter { $0 != "chimps" } 

上面的答案似乎假定你知道你想要删除的元素的索引。

通常你知道你想要在数组中删除的对象的引用 。 (你遍历你的数组,并find它,例如)在这种情况下,它可能会更容易直接与对象引用,而不必通过其索引的任何地方。 因此,我build议这个解决scheme。 它使用身份运算符 !== ,您可以使用它来testing两个对象引用是否都引用同一个对象实例。

 func delete(element: String) { list = list.filter() { $0 !== element } } 

当然这不仅适用于String

特定

 var animals = ["cats", "dogs", "chimps", "moose"] 

删除第一个元素

 animals.removeFirst() // "cats" print(animals) // ["dogs", "chimps", "moose"] 

删除最后一个元素

 animals.removeLast() // "moose" print(animals) // ["cats", "dogs", "chimps"] 

删除索引处的元素

 animals.remove(at: 2) // "chimps" print(animals) // ["cats", "dogs", "moose"] 

删除未知索引的元素

只有一个元素

 if let index = animals.index(of: "chimps") { animals.remove(at: index) } print(animals) // ["cats", "dogs", "moose"] 

对于多个元素

 var animals = ["cats", "dogs", "chimps", "moose", "chimps"] animals = animals.filter(){$0 != "chimps"} print(animals) // ["cats", "dogs", "moose"] 

或者,

 animals.index(of: "chimps").map { animals.remove(at: $0) } 

笔记

  • 上面的方法修改了数组( filter除外)并返回被删除的元素。
  • Swift指南映射filter减less
  • 如果你不想修改原始数组,你可以使用dropFirstdropLast来创build一个新的数组。

更新到Swift 3

你可以做到这一点。 首先确保Dog真的存在于数组中,然后将其删除。 如果您认为Dog可能会在您的arrays上多次发生,请添加for语句。

 var animals = ["Dog", "Cat", "Mouse", "Dog"] let animalToRemove = "Dog" for object in animals { if object == animalToRemove{ animals.removeAtIndex(animals.indexOf(animalToRemove)!) } } 

如果你确定Dog退出arrays,只发生一次就这样做:

 animals.removeAtIndex(animals.indexOf(animalToRemove)!) 

如果你有两个string和数字

 var array = [12, 23, "Dog", 78, 23] let numberToRemove = 23 let animalToRemove = "Dog" for object in array { if object is Int { // this will deal with integer. You can change to Float, Bool, etc... if object == numberToRemove { array.removeAtIndex(array.indexOf(numberToRemove)!) } } if object is String { // this will deal with strings if object == animalToRemove { array.removeAtIndex(array.indexOf(animalToRemove)!) } } } 

很less有操作涉及Swift中的数组

创build数组

 var stringArray = ["One", "Two", "Three", "Four"] 

在数组中添加对象

 stringArray = stringArray + ["Five"] 

从索引对象获取价值

 let x = stringArray[1] 

追加对象

 stringArray.append("At last position") 

在索引处插入对象

 stringArray.insert("Going", atIndex: 1) 

删除对象

 stringArray.removeAtIndex(3) 

Concat对象值

 var string = "Concate Two object of Array \(stringArray[1]) + \(stringArray[2])" 

如果您不知道要删除的元素的索引,并且元素符合Equatable协议,则可以执行以下操作:

animals.removeAtIndex(animals.indexOf("dogs")!)

请参阅Equatable协议答案: 我如何做indexOfObject或适当的containsObject

Swift 3:这是一个很酷且容易的扩展,可以删除数组中的元素,而不需要过滤:

 extension Array where Element: Equatable { // Remove first collection element that is equal to the given `object`: mutating func remove(object: Element) { if let index = index(of: object) { remove(at: index) } } } 

用法:

 var myArray = ["cat", "barbecue", "pancake", "frog"] let objectToRemove = "cat" myArray.remove(object: objectToRemove) // ["barbecue", "pancake", "frog"] 

关于@ Suragch的“删除未知索引元素”的替代方法:

有一个更强大的版本“indexOf(元素)”,将在谓词上匹配而不是对象本身。 它的名字相同,但是它被myObjects.indexOf {$ 0.property = valueToMatch}调用。 它返回在myObjects数组中find的第一个匹配项的索引。

如果该元素是一个对象/结构体,那么您可能想要根据其某个属性的值来移除该元素。 例如,你有一个Car类car.color属性,并且你想从你的carsArray中删除“红色”车。

 if let validIndex = (carsArray.indexOf{$0.color == UIColor.redColor()}) { carsArray.removeAtIndex(validIndex) } 

可以预见的是,你可以通过在repeat / while循环中embedded上面的if语句并附加一个else块来设置一个标志来“跳出”循环来重写这个去除“全部”红色汽车。

这应该做(未testing):

 animals[2..3] = [] 

编辑:你需要使它成为一个var ,而不是一个let ,否则它是一个不可变的常量。

如果你有自定义对象的数组,你可以通过这样的特定属性进行search:

  if let index = doctorsInArea.indexOf({$0.id == doctor.id}){ doctorsInArea.removeAtIndex(index) } 

或者如果你想通过名字search例子

  if let index = doctorsInArea.indexOf({$0.name == doctor.name}){ doctorsInArea.removeAtIndex(index) } 

使用索引数组删除元素:

  1. string和索引的数组

     let animals = ["cats", "dogs", "chimps", "moose", "squarrel", "cow"] let indexAnimals = [0, 3, 4] let arrayRemainingAnimals = animals .enumerated() .filter { !indexAnimals.contains($0.offset) } .map { $0.element } print(arrayRemainingAnimals) //result - ["dogs", "chimps", "cow"] 
  2. 整数和索引数组

     var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] let indexesToRemove = [3, 5, 8, 12] numbers = numbers .enumerated() .filter { !indexesToRemove.contains($0.offset) } .map { $0.element } print(numbers) //result - [0, 1, 2, 4, 6, 7, 9, 10, 11] 

使用另一个数组的元素值移除元素

  1. 整数数组

     let arrayResult = numbers.filter { element in return !indexesToRemove.contains(element) } print(arrayResult) //result - [0, 1, 2, 4, 6, 7, 9, 10, 11] 
  2. string的数组

     let arrayLetters = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] let arrayRemoveLetters = ["a", "e", "g", "h"] let arrayRemainingLetters = arrayLetters.filter { !arrayRemoveLetters.contains($0) } print(arrayRemainingLetters) //result - ["b", "c", "d", "f", "i"] 

我想出了下面的扩展,负责从Array中删除元素,假设Array的元素实现了可Equatable

 extension Array where Element: Equatable { mutating func removeEqualItems(item: Element) { self = self.filter { (currentItem: Element) -> Bool in return currentItem != item } } mutating func removeFirstEqualItem(item: Element) { guard var currentItem = self.first else { return } var index = 0 while currentItem != item { index += 1 currentItem = self[index] } self.removeAtIndex(index) } } 

用法:

 var test1 = [1, 2, 1, 2] test1.removeEqualItems(2) // [1, 1] var test2 = [1, 2, 1, 2] test2.removeFirstEqualItem(2) // [1, 1, 2] 

扩展名来移除String对象

 extension Array { mutating func delete(element: String) { self = self.filter() { $0 as! String != element } } } 

我使用这个扩展,几乎与Varun一样,但是这个(下面)是全用的:

  extension Array where Element: Equatable { mutating func delete(element: Iterator.Element) { self = self.filter{$0 != element } } }