2016-10-17 52 views
2

我需要過濾出一個MyClass3對象數組。 MyClass2對象數組是MyClass3對象的成員(請參閱下面的代碼)。 MyClass2對象有一個id。我手邊有一個idArray。我需要過濾掉其中[MyClass2]成員中存在idArray中的所有id的MyClass3對象。Swift - 用成員數組的屬性過濾數組

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(units:units1)和MyClass3(units:units3)。

這不行。有人建議可以斷言格式用於此目的

回答

7

使用謂詞格式字符串字符串插值從來沒有好的 的想法。您的謂詞的正確形式是

let searchPredicate = NSPredicate(format: "ANY arr.uid IN %@", ids) 

然而,檢查是否的UID的任何是在給定列表。 要檢查是否所有的UID在給定名單,下面的謂詞 應該工作:

let searchPredicate = NSPredicate(format: "SUBQUERY(arr.uid, $x, $x IN %@)[email protected] = %d", ids, ids.count) 

同樣可以在不謂詞在「純」雨燕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 }) } 
+0

謝謝:)它的工作 –

1

了可以使用執行交集操作,而不是NSPredicate:

請參考以下鏈接此

Set operations (union, intersection) on Swift array?

+0

我不能夠,因爲我有一個包含其他自定義陣列是使用idArray被過濾掉一個自定義的數組直接做到這一點。 –

+0

你可以使用這個操作,但你需要做一些你想要的結果的邏輯。 – KKRocks

+0

好的。將看看 –

0

你可以看看這個link的好例子,但是對於fil陣列的TeringBay您可以使用類似:

filteredArray = wholeArray.filter{ !unwantedArray.contains($0)}