2017-07-04 5 views
0

NSPredicate構文に関する問題が発生しました。私はクラスの型でオブジェクトの配列をフィルタリングしたい。Swift 3:NSPredicate(形式:)を使用してオブジェクトを種類/クラスでフィルタリングします

class ClassA: NSObject {} 
class ClassB: ClassA {} 
class ClassC: ClassA {} 

let array: [ClassA] = [ClassB(), ClassC()] 

は今、私はClassBの項目でろ過配列を取得するためにNSPredicateを使用したいです。

私がそうするようにブロックを使用することができ、そしてそれはこのようなものになるだろう:

let predicate = NSPredicate { (object, nil) -> Bool in 
    return object is ClassB 
} 

これは正当なアプローチですが、私はまたNSPredicate(形式:)とまったく同じことをしたいです。私は失敗し、次を試してみました他の試みの中で

let predicate = NSPredicate(format: "self = %@", [ClassB.self]) 
let predicate = NSPredicate(format: "SELF isKindOfClass: %@", [ClassB.self]) 

私はそれだけで、構文の問題でなければならないと思いますが、私は結果なしでこれを解決するために時間かけて探しています。

ありがとうございます。

+3

なぜネイティブ・スウィフト方法 'array.filter {$ 0 ClassBのですか}'? – vadian

+0

可能な複製https://stackoverflow.com/q/8065866/2557145 – Palle

+0

@vadianより複雑で動的な複合述語を作成したい – stoikr

答えて

0

これは動作するはずです:ここでは

let predicate = NSPredicate(format: "class = %@", ClassB.self) 

は、述語についてのドキュメントのページです - https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html#//apple_ref/doc/uid/TP40001793-CJBDBHCB

+0

ありがとうございました。しかし、私がこれを行うと、 "引数型 'ClassB.Type'が期待される型 'CVarArg'に適合しないというエラーが発生します。" – stoikr

+1

@stoikr ClassAはNSObjectからサブクラス化されていますか? –

+0

私のコードベースでは、実際にNSObjectのサブクラスであるNSManagedObjectです。 – stoikr

関連する問題