Могу ли я использовать NSPredicate в Swift с аргументом nil?

Я пытаюсь преобразовать проект, который использует Core Data из Objective-C в Swift.

Модель данных структурирована так, что у меня есть одна главная папка, которая содержит другие папки, - и эти папки также могут содержать другие папки через отношение "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)

... но компилятор жалуется на "Отсутствует метка аргумента" аргументArray: "в вызове. (Кажется, я запутываю его в мысли, что мне нужно использовать метод NSPredicate (format: argumentArray:) вместо...)

Есть ли правильный способ сделать это в Swift?

Ответ 1

Похоже, что это (с текущим выпуском Xcode 6 beta 3), как правило, сложно передать nil в список переменных аргументов.

Это работает:

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

Но самым простым решением было бы просто написать предикат как

NSPredicate(format: "parentFolder == nil")

Ответ 2

extension NSPredicate {

    convenience init?(attribute: String?, value: AnyObject?) {
        guard let attribute = attribute else {
            return nil
        }
        self.init(format: "%K == %@", argumentArray: [attribute, (value ?? "nil")])
    }

}