Removing duplicate elements from an array in Swift
You can convert to a Set
and back to an Array
again quite easily:
let unique = Array(Set(originals))
This is not guaranteed to maintain the original order of the array.
You can roll your own, e.g. like this:
func unique<S : Sequence, T : Hashable>(source: S) -> [T] where S.Iterator.Element == T { var buffer = [T]() var added = Set<T>() for elem in source { if !added.contains(elem) { buffer.append(elem) added.insert(elem) } } return buffer}let vals = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]let uniqueVals = uniq(vals) // [1, 4, 2, 6, 24, 15, 60]
And as an extension for Array
:
extension Array where Element: Hashable { func uniqued() -> Array { var buffer = Array() var added = Set<Element>() for elem in self { if !added.contains(elem) { buffer.append(elem) added.insert(elem) } } return buffer }}
Or more elegantly (Swift 4/5):
extension Sequence where Element: Hashable { func uniqued() -> [Element] { var set = Set<Element>() return filter { set.insert($0).inserted } }}
Which would be used:
[1,2,4,2,1].uniqued() // => [1,2,4]
Use a Set
or NSOrderedSet
to remove duplicates, then convert back to an Array
:
let uniqueUnordered = Array(Set(array))let uniqueOrdered = Array(NSOrderedSet(array: array))