J'ai des objets "UserDetails" dans un tableau. Je veux filtrer les objets d'un tableau. Mais il n'y a pas d'option pour "filterArrayUsingPredicate" dans le tableau Swift.
Ma création de tableau
var arrayOfUsers:UserDetails[] = UserDetails[]()
mon code utilisateur est
struct UserDetails{
var userName:String
var userID:String
var userAge:String
func userDescription()->String{
return "name " + userName + "age " + userID
}
}
mon code pour créer des objets
for a in 1...1000{
var user:UserDetails = UserDetails(userName: "name", userID: String(a), userAge: "22")
arrayOfUsers.append(user)
}
Maintenant, je veux filtrer arrayOfUsers
lequel a l'ID utilisateur "1".
Les tableaux rapides ont un .filter
méthode qui prend une fermeture - cela le fera:
let filteredArray = arrayOfUsers.filter() { $0.userID == "1" }
Les fermetures peuvent être simplifiées de différentes manières. La déclaration complète de la fermeture ressemblerait davantage à ceci:
var filteredArray = arrayOfUsers.filter( { (user: UserDetails) -> Bool in
return user.userID == "1"
})
La différence entre les deux réside dans le fait que le premier utilise la syntaxe de fermeture finale, les noms d’arguments abrégés, l’inférence de type et le retour implicite. Vous pouvez lire plus d'informations sur les fermetures dans la Swift) de Apple .
vous pouvez également utiliser NSPredicate
var customerNameDict = ["firstName":"karthi","LastName":"alagu","MiddleName":"prabhu"];
var clientNameDict = ["firstName":"Selva","LastName":"kumar","MiddleName":"m"];
var employeeNameDict = ["firstName":"karthi","LastName":"prabhu","MiddleName":"kp"];
var attributeValue = "karthi";
var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict];
var namePredicate =
NSPredicate(format: "firstName like %@",attributeValue);
let filteredArray = arrNames.filter { namePredicate.evaluateWithObject($0) };
println("names = ,\(filteredArray)");
// filtrage de structure
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 arrNames1:Array = [f1,f2];
let filteredArrayStruct = arrNames1.filter( { (user: myStruct) -> Bool in
return user.userid == "1"
})
println("filter array count = \(filteredArrayStruct.count)");
for filteredValues in filteredArrayStruct
{
println("filteredArrayStruct = ,\(filteredValues.details)");
}
Si vous filtrez un dictionnaire, vous pouvez le faire comme ceci.
var visitors = [["age" : 22], ["age" : 41], ["age" : 23], ["age" : 30]]
var filteredVisitors = visitors.filter({
$0["age"] < 30
})
println(filteredVisitors)
//[["age" : 22], ["age" : 23]]
La même chose s'applique aux structures où vous souhaitez filtrer sa propriété
struct Person {
var age : Int?
init(age: Int) {
self.age = age
}
}
var eventAttendees = [Person(age: 22), Person(age: 41), Person(age: 23), Person(age: 30)]
var filteredAttendees = eventAttendees.filter({
$0.age < 30
})
Vous pouvez vous référer à ces articles pour plus d'informations. Filtrage a Swift Tableau de dictionnaires ou propriété d'objet)
Dans Swift 3 ou 4 , vous pouvez utiliser NSPredicate avec tableau
let pred : NSPredicate = NSPredicate(format: "points_status = %@", "0")
let approvalRequestArray = approvalRequestOriginalArray.filtered(using: pred) as NSArray
let provincesStartingWithM = NSPredicate(format: "name contains [cd] 'a'")
provinces.filtered(using: provincesStartingWithM)
Pour plus d'informations, vous pouvez visiter ce lien GitHub
En fin de compte, il n'est pas nécessaire de comparer un seul filtre à la fois. Vous pouvez appliquer des conditions logiques pour élargir la portée du prédicat. Par exemple:
var foundArray = tempArray.filter{ String(describing:$0.id) .contains(searchText) ||
$0.name .contains(searchText) || $0.summary! .contains(searchText) ||
String(describing: $0.airDate).contains(searchText) || String(describing: $0.airTime).contains(searchText) ||
String(describing: $0.runTime).contains(searchText)}
fonctionne comme un champion.