Swift 3 Array, remove more than one item at once, with .remove(at: i)
It's possible if the indexes are continuous using removeSubrange
method.For example, if you would like to remove items at index 3 to 5:
myArray.removeSubrange(ClosedRange(uncheckedBounds: (lower: 3, upper: 5)))
For non-continuous indexes, I would recommend remove items with larger index to smaller one. There is no benefit I could think of of removing items "at the same time" in one-liner except the code could be shorter. You can do so with an extension method:
extension Array { mutating func remove(at indexes: [Int]) { for index in indexes.sorted(by: >) { remove(at: index) } }}
Then:
myArray.remove(at: [3, 5, 8, 12])
UPDATE: using the solution above, you would need to ensure the indexes array does not contain duplicated indexes. Or you can avoid the duplicates as below:
extension Array { mutating func remove(at indexes: [Int]) { var lastIndex: Int? = nil for index in indexes.sorted(by: >) { guard lastIndex != index else { continue } remove(at: index) lastIndex = index } }}var myArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]myArray.remove(at: [5, 3, 5, 12]) // duplicated index 5// result: [0, 1, 2, 4, 6, 7, 8, 9, 10, 11, 13] only 3 elements are removed
Remove elements using indexes of an array elements:
Array of Strings and indexes
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"]
Array of Integers and indexes
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]
Remove elements using element value of another array
Arrays of integers
var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]let elementsTobeRemoved = [3, 5, 8, 12]let arrayResult = numbers.filter { element in return !elementsTobeRemoved.contains(element)}print(arrayResult)//result - [0, 1, 2, 4, 6, 7, 9, 10, 11]
Arrays of strings
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"]
Simple and clear solution, just Array
extension:
extension Array { mutating func remove(at indices: [Int]) { Set(indices) .sorted(by: >) .forEach { rmIndex in self.remove(at: rmIndex) } }}
Set(indices)
- ensures uniqueness.sorted(by: >)
- function removes elements from last to first, so during removal we are sure that indexes are proper