web-dev-qa-db-ja.com

Swiftでnil引数を指定してNSPredicateを使用できますか?

CoreDataを使用するプロジェクトをObjective-CからSwiftに変換しようとしています。

データモデルは、他のフォルダーを含む1つのマスターフォルダーを持つように構成されています。これらのフォルダーには、「parentFolder」関係を介して他のフォルダーを含めることもできます。

現在、Objective-Cでこれを実行して、マスターフォルダーを取得しています(「parentFolder」のない唯一のフォルダーが見つかり、期待どおりに機能します)。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:"Folder"];
request.predicate = [NSPredicate predicateWithFormat:@"parentFolder == %@", nil];

Swiftに変換する際にも、同じことをしたいと思います。

let request = NSFetchRequest(entityName: "Folder")
request.predicate = NSPredicate(format: "parentFolder == %@", nil)

...しかし、コンパイラは呼び出し中に「引数ラベル 'argumentArray:'がありません」と文句を言います(代わりにNSPredicate(format:argumentArray :)メソッドを使用する必要があると誤解しているようです...)

Swiftでこれを行う正しい方法はありますか?

18
Jim Rhoades

(現在のXcode 6ベータ3リリースでは)変数引数リストでnilを渡すのは一般的に難しいように見えます。

これは機能しているようです

let predicate = NSPredicate(format: "parentFolder == %@", 0)
print(predicate)
// Output: parentFolder == nil

しかし最も簡単な解決策は単に述語を次のように書くことです

NSPredicate(format: "parentFolder == nil")
41
Martin R

最も簡単な解決策とあなたのケースに合うのは、述語を次のように書くことです。

NSPredicate(format: "parentFolder == nil")

ただし、引数としてnilを挿入する必要がある場合は、NSNullを使用できます。これは、オプションを使用している場合に役立つことがあります

let folderName: String? = nil
// ... assign folderName if available
NSPredicate(format: "parentFolder == %@", folderName ?? NSNull())

これにより、すべてのフォルダーが同じ親になります。親がnilの場合、親のないすべてのフォルダーがフェッチされます。

0
simonnickel