J'ai deux tableaux
let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4"]
let theFilter = ["star1", "star3"]
Comment filtrer le premier tableau en utilisant le second tableau? En fait, la theFilter
peut être modifiée dynamiquement, par exemple,
let theFilter = ["star2"]
or maybe
let theFilter = ["star0", "star4", "star2"]
Merci de votre aide :)
Utiliser Set Operations
Set(toBeFiltered).intersection(Set(theFilter))
En savoir plus: https://developer.Apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html
Vous pouvez également filtrer le tableau Struct
struct myStruct
{
var userid:String;
var details:String;
init() {
userid = "default value";
details = "default";
}
};
var f1 = myStruct();
f1.userid = "1";
f1.details = "Good boy";
var f2 = myStruct();
f2.userid = "2";
f2.details = "Bad boy";
var f3 = myStruct();
f3.userid = "3";
f3.details = "Gentleman";
var arrNames1:Array = [f1,f3];
var arrNames2:Array = [f3,f1,f2];
let filteredArrayStruct = arrNames1.filter( { (user: myStruct) -> Bool in
return arrNames2.contains({ (user1: myStruct) -> Bool in
return user.userid == user1.userid;
})
})
print(filteredArrayStruct)
Pour Set vous devez vous conformer au protocole Hashable
class mytestclass: Hashable
{
var userid:Int ;
var details:String;
var hashValue: Int {
return self.userid
}
init(userid: Int, details:String)
{
self.userid = userid;
self.details = details;
}
}
func ==(lhs: mytestclass, rhs: mytestclass) -> Bool {
return lhs.userid == rhs.userid
}
var t1 = mytestclass(userid: 1,details: "Good boy");
var t2 = mytestclass(userid: 2,details: "bad boy");
var t3 = mytestclass(userid: 3,details: "gentle man");
var classArrayNames:Set<mytestclass> = [t1,t2];
var classArrayNames2:Set<mytestclass> = [t3,t1,t2];
let result = Set(classArrayNames).intersect(classArrayNames2)
let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4"]
let theFilter = ["star1", "star3"]
let filtered = toBeFiltered.filter { theFilter.contains($0) }
cela semble être un thème d’aujourd’hui :) en me basant sur une autre excellente réponse, je suggérerais d’utiliser la méthode intersect(_:)
sur une Set
:
let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4"]
let theFilter = ["star1", "star3"]
let filtered = Set(toBeFiltered).intersect(theFilter)
// => ["star1", "star3"] of type Set<String>
// ...if you actually need an array, you can get one using Array(filtered)
Tout en utilisant Sets tel que proposé par Arsen est définitivement le plus élégant, parfois vous voulez garder des doublons et ordre :
//: Playground - noun: a place where people can play
import Foundation
extension Collection where Element: Equatable {
func intersection(with filter: [Element]) -> [Element] {
return self.filter { element in filter.contains(element) }
}
}
let toBeFiltered = ["star0", "star2", "star1", "star0", "star3", "star4", "star1"]
let theFilter = ["star1", "star3"]
let filtered = toBeFiltered.intersection(with: theFilter) // ["star1", "star3", "star1"]