filterArrayUsingPredicate n’existe pas dans swift Array

J’ai des objects de structure “UserDetails” dans le tableau .. Je veux filtrer les objects du 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 userdetails est

 struct UserDetails{ var userName:Ssortingng var userID:Ssortingng var userAge:Ssortingng func userDescription()->Ssortingng{ return "name " + userName + "age " + userID } } 

mon code pour créer des objects

  for a in 1...1000{ var user:UserDetails = UserDetails(userName: "name", userID: Ssortingng(a), userAge: "22") arrayOfUsers.append(user) } 

Maintenant, je veux filtrer arrayOfUsers dont on a l’ID utilisateur “1”.

Les tableaux Swift ont une méthode .filter 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 plus à ceci:

 var filteredArray = arrayOfUsers.filter( { (user: UserDetails) -> Bool in return user.userID == "1" }) 

La différence entre les deux est que la première consiste à utiliser la syntaxe de clôture finale, les noms d’argument abrégés, l’inférence de type et le retour implicite. Vous pouvez en savoir plus sur les fermetures dans la documentation d’Apple Swift .

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 atsortingbuteValue = "karthi"; var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict]; var namePredicate = NSPredicate(format: "firstName like %@",atsortingbuteValue); let filteredArray = arrNames.filter { namePredicate.evaluateWithObject($0) }; println("names = ,\(filteredArray)"); 

// filtrage de structure

 struct myStruct { var userid:Ssortingng; var details:Ssortingng; 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 ça.

 var visitors = [["age" : 22], ["age" : 41], ["age" : 23], ["age" : 30]] var filteredVisitors = visitors.filter({ $0["age"] < 30 }) println(filteredVisitors) //[["age" : 22], ["age" : 23]] 

Il en va de même pour les structures où vous filtreriez 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 d'un tableau Swift de dictionnaires ou d'une propriété d'object

En fait, il n’est pas nécessaire de comparer un seul filtre à la fois. Vous pouvez appliquer des conditions logiques pour élargir la scope du prédicat. Par exemple:

 var foundArray = tempArray.filter{ Ssortingng(describing:$0.id) .contains(searchText) || $0.name .contains(searchText) || $0.summary! .contains(searchText) || Ssortingng(describing: $0.airDate).contains(searchText) || Ssortingng(describing: $0.airTime).contains(searchText) || Ssortingng(describing: $0.runTime).contains(searchText)} 

travaille comme un champion.

Dans swift 3 ou 4, vous pouvez utiliser NSPredicate With Array

 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