2014-06-24 12 views
54

Ho gli oggetti struct "UserDetails" nell'array..Vorrei filtrare gli oggetti dall'array. Ma non c'è alcuna opzione per "filteredArrayUsingPredicate" nell'array Swift.filteredArrayUsingPredicate non esiste nell'array rapido

mia creazione dell'array

var arrayOfUsers:UserDetails[] = UserDetails[]() 

mio codice UserDetails è

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

il mio codice per creare oggetti

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

Ora voglio filtrare arrayOfUsers quale ha userID "1" .

+1

BEEP! iOS 8 è beta e anche XCode 6. – nicael

+0

quindi non posso filtrare con la versione beta? Sono nuovo di iOS, per favore mi corregga se ho fatto qualcosa di sbagliato .. –

+1

@Manimurugan Il punto di Nicael era che tu hai accettato di non discutere le beta di Apple in pubblico. Non sono sicuro che sia applicabile qui, però, perché il libro e il riferimento bibliografico di Swift sono pubblicati al pubblico senza vincoli. – dasblinkenlight

risposta

106

array Swift hanno un metodo .filter che prende una chiusura - questo farà:

let filteredArray = arrayOfUsers.filter() { $0.userID == "1" } 

chiusure possono essere semplificate in una varietà di modi. La dichiarazione completa della chiusura sarebbe più simile a questo:

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

La differenza tra i due è che il primo sta usando la sintassi finale di chiusura, nomi degli argomenti stenografia, inferenza di tipo, e rendimento implicito. È possibile leggere more about closures in Apple's Swift documentation.

+0

puoi dirmi per favore su $ symbol..qual è l'uso di questo? –

+2

'$ 0' è un nome di argomento abbreviato. Aggiungerò un po 'più di dettagli. –

+0

se è una matrice di dizionari, quindi come posso implementare il predicato per filtrare i dati per userID == 1 (se id utente è la chiave del dizionario)? –

80

è anche possibile utilizzare 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)"); 

// filtraggio 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 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)"); 
} 
+0

sì..può anche funzionare bene..grazie .. –

+1

@karthik Prabhu Cosa faresti se avessi una serie di strutture piuttosto che una serie di dizionari? 'lasciare filteredArray = {arrNames.filter namePredicate.evaluateWithObject ($ 0)};' Quella linea mi sta dando l'errore "Tipo 'myStruct' non è conforme al protocollo 'ANYOBJECT'" risposta a cura – Hobsie

+1

@Hobsie per voi –

5

Se si sta filtrando un dizionario si può fare in questo modo.

var visitors = [["age" : 22], ["age" : 41], ["age" : 23], ["age" : 30]] 

var filteredVisitors = visitors.filter({ 
    $0["age"] < 30 
}) 

println(filteredVisitors) 
//[["age" : 22], ["age" : 23]] 

Ebbene lo stesso vale per le strutture in cui si desidera filtrare la sua proprietà

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 
}) 

per ulteriori informazioni è possibile fare riferimento a questo articolo. Filtering a Swift Array of Dictionaries or Object property

0

a Swift 3 o 4 è possibile utilizzare NSPredicate Con 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) 

Per ulteriori informazioni, è possibile visitare questo link GitHub

Problemi correlati