2016-11-18 5 views
0

nach der Migration zu swift3, ich habe ein Problem, das nichtNSPredicate Absturz nach dem schnellen 3 Migration

let fetchRequest: NSFetchRequest<User> = User.fetchRequest() 
    fetchRequest.predicate = NSPredicate(format: "id == %@", id) 

meine App stürzt auf der zweiten Linie, schlechter Zugang, ohne Grund beheben. Typen sind richtig, kein Protokoll, nichts, nur schlechter Zugriff. irgendwelche Vorschläge?

Gefunden ein Grund, Prädikat falsch, Ursache-ID ist Int64-Typ, keine Ahnung, welche Art von Prädikat I

Antwort

5

Das %@ Format erwartet eine Foundation Objekt als Argument für diese Version von schnellen benötigen, vergleichen "Predicate Format String Syntax" in der "Prädikat-Programmieranleitung".

Sie überbrücken die Int64-NSNumber:

let id = Int64.max 
let predicate = NSPredicate(format: "id == %@", id as NSNumber) 
print(predicate) // id == 9223372036854775807 

oder das Format ändern, um "long long":

let id = Int64.max 
let predicate = NSPredicate(format: "id == %lld", id) 
print(predicate) // id == 9223372036854775807 

Bridging alle Nummerntypen zu NSNumber möglich ist, wie der Swift 3.0 .1 (Xcode 8.1) mit der Implementierung SE-0139 Bridge Numeric Types to NSNumber and Cocoa Structs to NSValue.

+1

Und FWIW, das bedeutet, dass das Prädikat immer falsch war, und dass die Änderung mit Swift 3 darin besteht, klar zu machen, dass es falsch ist. –

+0

@TomHarrington es ist ein ziemlich interessant, weil alles richtig funktioniert –

Verwandte Themen