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でこれを行う正しい方法はありますか?
(現在のXcode 6ベータ3リリースでは)変数引数リストでnil
を渡すのは一般的に難しいように見えます。
これは機能しているようです:
let predicate = NSPredicate(format: "parentFolder == %@", 0)
print(predicate)
// Output: parentFolder == nil
しかし最も簡単な解決策は単に述語を次のように書くことです
NSPredicate(format: "parentFolder == nil")
最も簡単な解決策とあなたのケースに合うのは、述語を次のように書くことです。
NSPredicate(format: "parentFolder == nil")
ただし、引数としてnilを挿入する必要がある場合は、NSNullを使用できます。これは、オプションを使用している場合に役立つことがあります
let folderName: String? = nil
// ... assign folderName if available
NSPredicate(format: "parentFolder == %@", folderName ?? NSNull())
これにより、すべてのフォルダーが同じ親になります。親がnilの場合、親のないすべてのフォルダーがフェッチされます。