使用NSPredicate根据属性(NSDictionary)过滤对象的NSArray

时间:2015-08-22 23:24:21

标签: ios swift nspredicate

我有一个具有以下属性的NSArray对象

@objc class Dummy: NSObject {
    let propertyOne: Int
    let propertyTwo: Int
    let propertyThree: NSDictionary
}

propertyThree中,它将具有某些键值对,例如

keyOne => valueOne
keyTwo => valueTwo
keyThree => valueThree

我希望根据keyOne NSDictionary对象Dummy的{​​{1}}来过滤我的NSArray虚拟对象。

我该怎么做呢?我仔细看了看:

但它似乎并不适用。

3 个答案:

答案 0 :(得分:5)

您没有提供有关您使用NSPredicate的任何代码,因此我写了一个简单的示例。也许这会对你有帮助。

@objc class Dummy: NSObject {
    let propertyOne: Int = 1
    let propertyTwo: Int = 1
    let propertyThree: NSDictionary

    init(dict: NSDictionary) {
        propertyThree = dict
        super.init()
    }
}

let arr: NSArray = [
    Dummy(dict: ["keyOne" : "one"]),
    Dummy(dict: ["keyOne" : "two"]),
    Dummy(dict: ["keyOne" : "three"]),
    Dummy(dict: ["keyOne" : "one"]),
    Dummy(dict: ["keyOne" : "five"])
]

let predicate = NSPredicate(format: "SELF.propertyThree.keyOne == 'one'")
let results = arr.filteredArrayUsingPredicate(predicate)
print(results)

答案 1 :(得分:1)

在Objective-C中:

[array filteredArrayUsingPredicate:[NSPredicate 
                         predicateWithFormat:@"propertyThree.keyOne = %@", value]];

在Swift中你可以使用它的改编,但正如Kametrixom所暗示的那样,使用filter和闭包更为正常;这是消除动态键值编码步骤的机制。

答案 2 :(得分:0)

在这里,使用真正的Swift:

class Dummy {
    let propertyOne: Int = 1
    let dict: [String : String]

    init(dict: [String : String]) {
        self.dict = dict
    }
}

let arr = [
    Dummy(dict: ["keyOne" : "one"]),
    Dummy(dict: ["keyOne" : "two"]),
    Dummy(dict: ["keyOne" : "three"]),
    Dummy(dict: ["keyOne" : "one"]),
    Dummy(dict: ["keyOne" : "five"])
]

let result = arr.filter { $0.dict["keyOne"] == "one" }

很少注意到:

  • 你不需要你的类继承Swift中的NSObject,如果他们这样做,@objc属性仍被隐式应用
  • 使用[NSObject : AnyObject]代替NSDictionary,因为它等效。我在这里使用[String : String],因为这显然是什么
  • 使用filter方法,您可以以类型安全的方式过滤数组,也可以更快