如何从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
- 如果你不想修改原始数组,你可以使用
dropFirst
或dropLast
来创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) }
使用索引数组删除元素:
-
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"]
-
整数和索引数组
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]
使用另一个数组的元素值移除元素
-
整数数组
let arrayResult = numbers.filter { element in return !indexesToRemove.contains(element) } print(arrayResult) //result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
-
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 } } }