web-dev-qa-db-fra.com

filterArrayUsingPredicate n'existe pas dans Swift Le tableau

J'ai des objets "UserDetails" dans un tableau. Je veux filtrer les objets d'un 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 utilisateur est

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

mon code pour créer des objets

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

Maintenant, je veux filtrer arrayOfUsers lequel a l'ID utilisateur "1".

67
Mani murugan

Les tableaux rapides ont un .filter méthode 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 davantage à ceci:

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

La différence entre les deux réside dans le fait que le premier utilise la syntaxe de fermeture finale, les noms d’arguments abrégés, l’inférence de type et le retour implicite. Vous pouvez lire plus d'informations sur les fermetures dans la Swift) de Apple .

118
Nate Cook

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

// filtrage de structure

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

Si vous filtrez un dictionnaire, vous pouvez le faire comme ceci.

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

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

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

La même chose s'applique aux structures où vous souhaitez filtrer 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 a Swift Tableau de dictionnaires ou propriété d'objet)

5
naz

Dans Swift 3 ou 4 , vous pouvez utiliser NSPredicate avec tableau

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

2
Anup Gupta

En fin de compte, il n'est pas nécessaire de comparer un seul filtre à la fois. Vous pouvez appliquer des conditions logiques pour élargir la portée du prédicat. Par exemple:

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

fonctionne comme un champion.

1
Peter Brockmann