2014-07-10 6 views
11

Sto provando a convertire un progetto che utilizza Core Data da Objective-C a Swift.Posso usare un NSPredicate in Swift con un argomento nullo?

Il modello di dati è strutturato in modo da avere una cartella principale che contiene altre cartelle e tali cartelle possono contenere anche altre cartelle, tramite una relazione "parentFolder".

Attualmente, faccio questo in Objective-C per recuperare la cartella principale (che trova l'unica cartella senza un "parentFolder", e funziona come previsto):

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

Nella conversione a Swift, I' d piace fare la stessa cosa:

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

... ma il compilatore si lamenta con il "label argomento mancante 'argumentArray:'. a chiamata (mi sembra di essere confusione in pensiero ho bisogno di usare il NSPredicate (formato: argumentArray :) metodo invece ...)

C'è un modo corretto per farlo in Swift?

risposta

26

Sembra che sia (con l'attuale rilascio Xcode 6 beta 3) generalmente difficile passare nil in un elenco di argomenti variabile.

Questo sembra funzionare:

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

Ma la soluzione più semplice sarebbe quella di scrivere semplicemente il predicato come

NSPredicate(format: "parentFolder == nil") 
+1

Quel "soluzione più semplice" funziona perfettamente, grazie tu! –

0
extension NSPredicate { 

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

}