Valores únicos de array en swift

Estoy construyendo una aplicación de iOS con rapidez y necesito obtener todos los valores únicos de una matriz de cadenas.

He estado leyendo los documentos para desarrolladores de Apple, pero no parece tener una función para eso.

¿Alguien puede darme una pista?

Una forma es usar un conjunto:

 let array = ["one", "one", "two", "two", "three", "three"] let unique = Array(Set(array)) // ["one", "two", "three"] 

También puede crear una extensión que se filtre a través de la matriz más explícitamente:

 extension Array where Element : Equatable { var unique: [Element] { var uniqueValues: [Element] = [] forEach { item in if !uniqueValues.contains(item) { uniqueValues += [item] } } return uniqueValues } } 

NOTA

La matriz única estará en un orden no especificado, y es posible que deba ordenarla. Algunas veces es mejor que lo hagas tú mismo enumerando, podrías escribir una extensión.

Sería bueno hacer una extensión (Swift 2):

 extension Array where Element : Hashable { var unique: [Element] { return Array(Set(self)) } } 

Probablemente haya formas más optimizadas de hacer lo que quiera, pero de esta manera es rápido y fácil.

No hay una función para hacer esto en la biblioteca estándar Swift, pero podrías escribir una:

 extension Sequence where Iterator.Element: Hashable { func unique() -> [Iterator.Element] { var seen: [Iterator.Element: Bool] = [:] return self.filter { seen.updateValue(true, forKey: $0) == nil } } } let a = ["four","one", "two", "one", "three","four", "four"] a.unique // ["four", "one", "two", "three"] 

Esto tiene la desventaja de requerir que los contenidos de la secuencia sean aptos para ser manejables, no solo equivalentes, pero también lo más equitativo, incluidas las cadenas.

También conserva el orden original a diferencia, digamos, de poner los contenidos en un diccionario o conjunto y luego volverlos a sacar.

No sé de una manera integrada. Esta función genérica lo haría:

 func distinct(source: S) -> [E] { var unique = [E]() for item in source { if !contains(unique, item) { unique.append(item) } } return unique } 

La desventaja aquí es que esta solución se ejecuta en O (n 2 ).

Use un diccionario como var unique = [:Bool]() y complete los valores como unique[] = true en un bucle. Ahora unique.keys tiene lo que necesitas.