webentwicklung-frage-antwort-db.com.de

filtersArrayUsingPredicate existiert nicht in Swift Array

Ich habe "UserDetails" Strukturobjekte im Array. Ich möchte die Objekte aus dem Array filtern. Es gibt jedoch keine Option für "filtersArrayUsingPredicate" im Array Swift.

Meine Array-Erstellung

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

mein benutzerdetails code ist

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

mein Code zum Erstellen von Objekten

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

Jetzt möchte ich arrayOfUsers filtern, dessen Benutzer-ID "1" lautet.

67
Mani murugan

Schnelle Arrays haben ein .filter Methode, die eine Schließung annimmt - das wird es tun:

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

Verschlüsse können auf verschiedene Arten vereinfacht werden. Die vollständige Erklärung der Schließung würde ungefähr so ​​aussehen:

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

Der Unterschied zwischen den beiden besteht darin, dass der erste die nachfolgende Abschlusssyntax, Kurzargumentnamen, Typinferenz und implizite Rückgabe verwendet. Sie können lesen mehr über Schließungen in der Dokumentation von Apple Swift .

118
Nate Cook

sie können auch NSPredicate verwenden

    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)");

// Strukturfilterung

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)");
}
97

Wenn Sie ein Wörterbuch filtern, können Sie dies folgendermaßen tun.

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

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

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

Das gleiche gilt für Strukturen, bei denen Sie die Eigenschaft filtern würden

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

Weitere Informationen finden Sie in diesen Artikeln. Filterung eines Swift Array von Wörterbüchern oder Object-Eigenschaft

5
naz

In Swift 3 oder 4 Sie können NSPredicate Mit 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)

Für weitere Informationen besuchen Sie diesen Link GitHub

2
Anup Gupta

Wie sich herausstellt, müssen Sie nicht immer nur einen Filter gleichzeitig vergleichen. Sie können logische Bedingungen anwenden, um den Gültigkeitsbereich des Prädikats zu erweitern. Beispielsweise:

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

arbeitet wie ein Champion.

1
Peter Brockmann