我有一个具有以下属性的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虚拟对象。
我该怎么做呢?我仔细看了看:
但它似乎并不适用。
答案 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" }
很少注意到:
NSObject
,如果他们这样做,@objc
属性仍被隐式应用[NSObject : AnyObject]
代替NSDictionary
,因为它等效。我在这里使用[String : String]
,因为这显然是什么filter
方法,您可以以类型安全的方式过滤数组,也可以更快