NSPredicate在swift 3迁移后崩溃

在迁移到swift3之后,我有一个无法修复的问题

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

我的应用程序在第二行崩溃,访问不良,没有理由。 types是正确的,没有日志,没有什么,只是不好的访问。 有什么build议么?

发现原因,谓词错误,导致id是Int64types,不知道这个版本的swift需要什么样的谓词

%@格式期望Foundation对象作为参数,比较“Predicate Programming Guide”中的“Predicate Format String Syntax ”。

您可以将Int64桥接到NSNumber

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

或将格式更改为“long long”:

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

在Swift 3.0.1(Xcode 8.1)中,将所有数字types桥接到NSNumber是可能的,实现SE-0139桥接数字types到NSNumber和Cocoa Structs到NSValue 。