Solución:
Voy a sugerir 2 soluciones.
Ambos enfoques necesitarán Post
ser Hashable
y equitativo
Poste conforme a Hashable y Equatable
Aquí estoy asumiendo tu Post
estructura (o clase) tiene una id
propiedad de tipo String
.
struct Post: Hashable, Equatable {
let id: String
var hashValue: Int { get { return id.hashValue } }
}
func ==(left:Post, right:Post) -> Bool {
return left.id == right.id
}
Solución 1 (perdiendo el orden original)
Para eliminar duplicados, puede utilizar un Set
let uniquePosts = Array(Set(posts))
Solución 2 (preservando el orden)
var alreadyThere = Set<Post>()
let uniquePosts = posts.flatMap { (post) -> Post? in
guard !alreadyThere.contains(post) else { return nil }
alreadyThere.insert(post)
return post
}
Puede crear una matriz vacía “uniquePosts” y recorrer su matriz “Posts” para agregar elementos a “uniquePosts” y cada vez que agregue debe verificar si ya agregó el elemento o no lo hizo. El método “contiene” puede ayudarte.
func removeDuplicateElements(post: [Post]) -> [Post] {
var uniquePosts = [Post]()
for post in posts {
if !uniquePosts.contains(where: {$0.postId == post.postId }) {
uniquePosts.append(post)
}
}
return uniquePosts
}
mis soluciones Swift ‘puras’ sin conformidad de Post con Hashable (requerido por Set)
struct Post {
var id: Int
}
let posts = [Post(id: 1),Post(id: 2),Post(id: 1),Post(id: 3),Post(id: 4),Post(id: 2)]
// (1)
var res:[Post] = []
posts.forEach { (p) -> () in
if !res.contains ({ $0.id == p.id }) {
res.append(p)
}
}
print(res) // [Post(id: 1), Post(id: 2), Post(id: 3), Post(id: 4)]
// (2)
let res2 = posts.reduce([]) { (var r, p) -> [Post] in
if !r.contains ({ $0.id == p.id }) {
r.append(p)
}
return r
}
print(res2) // [Post(id: 1), Post(id: 2), Post(id: 3), Post(id: 4)]
Prefiero (1) encapsulado en función (también conocido como func unique(posts:[Post])->[Post]
), tal vez una matriz de extensión …
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)