How to remove an array of objects from a Swift 2 Array - removeObjectsInArray
/I was working on a game project in Swift and I wanted to remove objects from an Array, only to discover that my goto method from Objective-C’s NSMutableArray (removeObjectsInArray:) didn’t exist.
Removing multiple objects from an Array takes multiple steps – when you iterate over an Array you cannot remove objects. It’s a two step process, you need to discover which objects need to be removed and then you need to iterate through that list and remove each one, one at a time.
The code has changed between Swift 1.2 and Swift 2 – I’ll include both to show the differences.
Swift 1.2 Remove Multiple Objects from an Array
You can start by creating an array of objects – add to the end with append() or insert() at a specific index.
Next you will need to search for something in your Swift Array – for this example you’ll look for words with a specific letter.
Lastly you’ll need to remove each word that contains the letter one at a time, outside of your first loop.
// Swift 1.2
var wordArray = ["Apple", "Carrot", "Peanut Butter"]
wordArray.append("Hummus")
wordArray.insert("Greek Salad", atIndex: 0)
// Find the objects to remove
var wordsToDelete: [String] = [String]()
for word in wordArray {
if contains(word.lowercaseString, "p") {
wordsToDelete.append(word)
}
}
// Find the index and remove each object
for word in wordsToDelete {
if let index = find(wordArray, word) {
wordArray.removeAtIndex(index)
}
} Swift 2 Remove Multiple Objects from an Array
Swift 2 changes the contains() function to a contains() method using Protocol Extensions and since we’re working with Swift 2 Strings – the character property needs to be used.
The global find() function is now replaced by the new indexOf() method on Array (technically CollectionType).
// Swift 2
var wordArray = ["Apple", "Carrot", "Peanut Butter"]
wordArray.append("Hummus")
wordArray.insert("Greek Salad", atIndex: 0)
// Find the objects to remove
var wordsToDelete: [String] = [String]()
for word in wordArray {
if word.lowercaseString.characters.contains("p") {
wordsToDelete.append(word)
}
}
// Find the index and remove each object
for word in wordsToDelete {
if let index = wordArray.indexOf(word) {
wordArray.removeAtIndex(index)
}
}
Swift 2 Array Protocol Extension removeObjectsInArray
With the basics of removing objects from an Array you can take it a step further to get back to a single line of code to remove objects.
Using an extension in Swift 2 allows you to add functionality that’s missing from the Array type. An Array is a structure, so you’ll have to use the mutating keyword and the Element is the type of object that is in the Array (generics).
Equatable means that the type must support the == (equal to) method, which is required to find an object. String objects are already equatable, so you don't need to do any extra work. If you are storing a custom object you will need to implement your own isEqual method.
// Swift 2 Array Extension
extension Array where Element: Equatable {
mutating func removeObject(object: Element) {
if let index = self.indexOf(object) {
self.removeAtIndex(index)
}
}
mutating func removeObjectsInArray(array: [Element]) {
for object in array {
self.removeObject(object)
}
}
}
With the Array Extension you can simplify your last 4 lines of code into a single line of code to remove an array of objects.
// Swift 2
var wordArray = ["Apple", "Carrot", "Peanut Butter"]
wordArray.append("Hummus")
wordArray.insert("Greek Salad", atIndex: 0)
// Find the objects to remove
var wordsToDelete: [String] = [String]()
for word in wordArray {
if word.lowercaseString.characters.contains("p") {
wordsToDelete.append(word)
}
}
// Remove an array of objects
wordArray.removeObjectsInArray(wordsToDelete)Free Online Swift App Course
Subscribe and get access to the Free iPhone App Course – you can make your first iPhone app using Swift.

