[英]Swift - Predicate to filter an array by a property of member array
我需要過濾掉一組MyClass3對象。 MyClass2對象的數組是MyClass3對象的成員(請參閱下面的代碼)。 MyClass2對象有一個id。 我手邊有一個idArray。 我需要過濾掉那些MyClass3對象,其中idArray中的所有id都存在於其[MyClass2]成員中。
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)。
這沒有用。 有人可以為此目的建議謂詞格式
在謂詞格式字符串中使用字符串插值絕不是一個好主意。 你謂詞的正確形式是
let searchPredicate = NSPredicate(format: "ANY arr.uid IN %@", ids)
但是,檢查是否有任何 uid在給定列表中。 要檢查所有 uid是否在給定列表中,以下謂詞應該有效:
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 }) }
您可以查看此鏈接以獲取良好示例,但是對於數組的過濾,您可以使用以下內容:
filteredArray = wholeArray.filter{ !unwantedArray.contains($0)}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.