我需要过滤出一个MyClass3对象数组。MyClass2对象的数组是MyClass3对象的成员(请参考下面的代码)。MyClass2对象有一个id。我手头有一台idArray。我需要过滤掉那些idArray中的所有ids都存在于其MyClass2成员中的MyClass3对象。
class MyClass2 : NSObject {
var uid: Int = 0
init(uid : Int) {
self.uid = uid
}
}
class MyClass3 : NSObject {
var arr: [MyClass2]
init(units: [MyClass2]) {
arr = units
}
}
var units1 = [MyClass2(uid: 1),MyClass2(uid: 2), MyClass2(uid: 3), MyClass2(uid: 4), MyClass2(uid: 5)]
var units2 = [MyClass2(uid: 4),MyClass2(uid: 5), MyClass2(uid: 6)]
var units3 = [MyClass2(uid: 3),MyClass2(uid: 5), MyClass2(uid: 7), MyClass2(uid: 1)]
var ids = [1,5]
var available3: [MyClass3] = [MyClass3(units: units1), MyClass3(units: units2), MyClass3(units: units3)]
var filtered3: [MyClass3] = []
let searchPredicate: NSPredicate = NSPredicate(format: " ANY arr.uid IN \(ids)") // needed predicate
print(searchPredicate.predicateFormat)
filtered3 = (available3 as NSArray).filteredArrayUsingPredicate(searchPredicate) as! [MyClass3]所需的答案是我们在过滤后的数组中需要MyClass3(单位: units1)和MyClass3(单位: units3)。
这是行不通的。有人能为此建议一种谓词格式吗?
发布于 2016-10-17 16:46:28
在谓词格式字符串中使用字符串插值从来都不是一个好主意。谓词的正确形式应该是
let searchPredicate = NSPredicate(format: "ANY arr.uid IN %@", ids)但是,这将检查给定列表中是否存在任何uids。要检查所有uids是否都在给定列表中,应使用以下谓词:
let searchPredicate = NSPredicate(format: "SUBQUERY(arr.uid, $x, $x IN %@).@count = %d", ids, ids.count)在“纯”Swift 3中不使用谓词也可以实现同样的效果,因为
filtered3 = available3.filter { $0.arr.filter { ids.contains($0.uid) }.count == ids.count }或
filtered3 = available3.filter { Set(ids).isSubset(of: $0.arr.map { $0.uid }) }发布于 2016-10-17 16:35:21
发布于 2016-10-17 18:03:53
您可以查看此link以获得很好的示例,但对于数组过滤,您可以使用以下内容:
filteredArray = wholeArray.filter{ !unwantedArray.contains($0)}https://stackoverflow.com/questions/40081680
复制相似问题