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.