Chen Li Yong Chen Li Yong - 3 years ago 166
Swift Question

Can somebody give a snippet of "append if not exists" method in swift array?

Because I use this routine a lot, can somebody create an extension method of Swift array which will detect whether if the data that is going to be appended already exists, then it's not appended? I know that it's only a matter of few code like this:

var arr = [Int]()
for element in inputArr {
if !arr.contains(element) { arr.append(element); }
}


Becomes:

var arr = [Int]()
for element in inputArr { arr.appendUnique(element); }


Or:

var arr = [String]()
for element in inputArr {
if !arr.contains(element) { arr.append(element); }
}


Becomes:

var arr = [Int]()
for element in inputArr { arr.appendUnique(element); }


Same method for different element types. Frankly, from this simple code, I also want to learn on how to extend the
Collection
with variable types. It fascinates me how Array's methods can have different parameter types whenever the object was initialized with different parameter types. Array and Dictionary are two things that I still don't get how to extend them properly. Thanks.

Answer Source

You will need to constrain your array elements to equatable and make your method mutating. If you want to return Bool in case the appends succeeds you can also make the result discardable. Your extension should look like this:

extension Array where Element: Equatable {
    @discardableResult
    mutating func appendIfNotContains(_ element: Element) -> Bool {
        if !contains(where: {$0 == element}) {
            append(element)
            return true
        }
        return false
    }
}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download