color bar ios swift

ios - bar - Valores únicos de matriz en swift



uinavigationitem title color (4)

Estoy creando una aplicación para iOS con rapidez y necesito obtener todos los valores únicos de una variedad de cadenas.

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

¿Alguien puede darme una pista?


No hay una función para hacer esto en la biblioteca estándar de Swift, pero podría 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 el inconveniente de requerir que los contenidos de la secuencia sean hashables, no solo equiparables, sino que también lo son las cosas más equiparables, incluidas las cadenas.

También conserva el orden original a diferencia de, por ejemplo, poner el contenido en un diccionario o conjunto y luego volver a sacarlo.


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

func distinct<S: SequenceType, E: Equatable where E==S.Generator.Element>(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 ).


Una forma es usar un conjunto:

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

También podría crear una extensión que filtre a través de la matriz de manera más explícita:

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. A veces es mejor hacerlo usted mismo enumerando, podría escribir una extensión.

Puede ser 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 desea, pero esta forma es rápida y fácil.


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