2014-06-24 13 views
54

Mam obiekty struct "UserDetails" w tablicy .. Chcę filtrować obiekty z tablicy. Ale nie ma opcji "filtersArrayUsingPredicate" w tablicy Swift.filteredArrayUsingPredicate nie istnieje w Swift Array

Moje stworzenie tablicy

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

mój kod userdetails jest

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

mojego kodu do tworzenia obiektów

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

Teraz chcę filtrować arrayOfUsers których jeden ma identyfikator użytkownika "1" .

+1

BEEP! iOS 8 to wersja beta, a XCode 6 też. – nicael

+0

, więc nie mogę filtrować w wersji beta? Jestem nowy na iOS, proszę, popraw mnie, jeśli zrobię coś złego ... –

+1

@Manimurugan nicael wskazywał na to, że zgodziłeś się nie rozmawiać o betach Apple publicznie. Nie jestem pewien, czy ma to zastosowanie tutaj, ponieważ publikacja książki i biblioteki Swift jest udostępniana publicznie bez żadnych zobowiązań. – dasblinkenlight

Odpowiedz

106

Swift tablice mają .filter metodę, która przyjmuje zamknięcie - to to zrobi:

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

Zamknięcia mogą zostać uproszczone w różny sposób. Pełna deklaracja zamknięcia będzie wyglądać mniej więcej tak:

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

Różnica między nimi jest taka, że ​​najpierw korzysta z tyłu składni zamknięcia, nazwy argumentów skrótowym, wpisz dedukcyjnego i niejawny powrót. Możesz przeczytać more about closures in Apple's Swift documentation.

+0

czy możesz mi powiedzieć o symbolu $ .. co to oznacza? –

+2

'$ 0' jest skróconą nazwą argumentu. Dodam trochę więcej szczegółów. –

+0

jeśli jest to tablica słowników, to jak zaimplementować predykat do filtrowania danych dla ID użytkownika == 1 (jeśli identyfikatorem użytkownika jest klucz)? –

80

można również użyć 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)"); 

// filtrowanie 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

yes..its również działa dobrze..dzięki koleś .. –

+1

@karthik Prabhu Co byś zrobił, gdybyś miał tablicę struktur, a nie tablicę słowników? 'niech filteredArray = arrNames.filter {namePredicate.evaluateWithObject (0 $)};' To linia daje mi błąd "Type 'myStruct' nie jest zgodny z protokołem 'AnyObject'" – Hobsie

+1

@Hobsie redakcją odpowiedź dla ciebie –

5

Jeśli filtrowanie słownika można zrobić to w ten sposób.

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

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

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

Cóż to samo dotyczy elemencie gdzie filtrować swoją własność

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

Można odwołać się do tych artykułów uzyskać więcej informacji. Filtering a Swift Array of Dictionaries or Object property

0

w Swift 3 lub 4 można użyć NSPredicate Z 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) 

Aby uzyskać więcej informacji, można odwiedzić ten link GitHub

Powiązane problemy