2016-10-17 8 views
2

MyClass3オブジェクトの配列をフィルタリングする必要があります。 MyClass2オブジェクトの配列はMyClass3オブジェクトのメンバーです(下記のコードを参照してください)。 MyClass2オブジェクトにはIDがあります。手元にidArrayがあります。 idArrayのすべてのIDが[MyClass2]メンバーに存在するMyClass3オブジェクトを除外する必要があります。そしてMyClass3(単位:units3)フィルタアレイで: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(units1単位)必要があるということです。

これは機能しません。誰かがあなたの代わりにNSPredicateの交差点操作を行う使用して行うことができ、この目的の

答えて

7

のためにリンクの下に参照してくださいです決して良い アイデア。あなたの述語の正しい形式は、のuidの任意のが与えられたリストにあるかどうかを確認しかし、

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

だろう。 すべてのUIDが与えられたリストにある場合 は確認するには、次の述語 は動作するはずです:

同じことが

filtered3 = available3.filter { $0.arr.filter { ids.contains($0.uid) }.count == ids.count } 

ようスウィフト3「純粋」で述語することなく達成することができる

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

filtered3 = available3.filter { Set(ids).isSubset(of: $0.arr.map { $0.uid }) } 
+0

ありがとう:)それは働いた –

1

のための述語形式を提案することができます:

述語フォーマット文字列に文字列の補間を使用して、この

Set operations (union, intersection) on Swift array?

+0

idArrayを使用してフィルタリングされる別のカスタム配列を含むカスタム配列があるため、これを直接行うことはできません。 –

+0

あなたはこの操作を使用して行うことができますが、あなたが望む結果のためにいくつかのロジックを行う必要があります。 – KKRocks

+0

それを見てください –

0

このlinkは良い例がありますが、fil配列の検索には次のようなものを使用できます:

filteredArray = wholeArray.filter{ !unwantedArray.contains($0)} 
関連する問題