web-dev-qa-db-ja.com

FilteredArrayUsingPredicateがSwift配列に存在しません

配列に「UserDetails」構造体オブジェクトがあります。配列からオブジェクトをフィルタリングしたいのですが。ただし、Swift配列には「filteredArrayUsingPredicate」のオプションはありません。

私のアレイ作成

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

私のuserdetailsコードは

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

オブジェクトを作成するための私のコード

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

ここで、ユーザーIDが「1」であるarrayOfUsersをフィルタリングします。

67
Mani murugan

Swift配列には、クロージャーを取得する.filterメソッドがあります。これにより実行されます。

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

クロージャーはさまざまな方法で簡素化できます。クロージャの完全な宣言は次のようになります。

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

2つの違いは、1つ目は末尾のクロージャー構文、省略形の引数名、型推論、および暗黙的な戻り値を使用していることです。 AppleのSwiftドキュメントのクロージャの詳細 を読むことができます。

118
Nate Cook

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

//フィルタリングを構成する

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

辞書をフィルタリングする場合、次のように実行できます。

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

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

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

まあ同じことがプロパティをフィルタリングする構造体にも当てはまります

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

詳細については、この記事を参照してください。 辞書またはオブジェクトプロパティのSwift配列のフィルタリング

5
naz

Swift 3または4では、NSPredicateWithArray

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)

詳細については、このリンクをご覧ください GitHub

2
Anup Gupta

結局のところ、一度に1つのフィルターのみを比較する必要はありません。論理条件を適用して、述部の範囲を広げることができます。例えば:

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

チャンピオンのように機能します。

1
Peter Brockmann