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