2014-07-10 4 views
11

Ich versuche, ein Projekt zu konvertieren, das Core Data von Objective-C zu Swift verwendet.Kann ich ein NSPredate in Swift mit einem Null-Argument verwenden?

Das Datenmodell ist so strukturiert, dass ich einen Hauptordner habe, der andere Ordner enthält - und diese Ordner können auch andere Ordner enthalten, über eine "parentFolder" -Beziehung.

Derzeit Ich tue dies in Objective-C, um den Master-Ordners abrufen (es findet den einzigen Ordner ohne "parent" und arbeitet als erwartet):

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

zu Swift Bei der Umwandlung, I‘ d mögen die gleiche Sache tun:

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

... aber der Compiler beschwert sich mit „Missing Argument label‚argumentArray:‘. in Call (ich scheine es zu denken, zu verwirrend zu sein, muss ich die NSPredicate verwenden (Format: argumentArray :) Methode statt ...)

Gibt es einen richtigen Weg, dies in Swift zu tun?

Antwort

26

Es sieht so aus, als wäre es (mit der aktuellen Xcode 6 Beta 3 Version) generell schwierig nil in einer variablen Argumentliste zu bestehen.

Diese scheinen zu arbeiten:

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

Aber die einfachste Lösung wäre, einfach das Prädikat schreiben als

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

Die "einfachste Lösung" funktioniert perfekt, danke Sie! –

0
extension NSPredicate { 

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

}