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