swift 3 迁移后 NSPredicate 崩溃
Posted
技术标签:
【中文标题】swift 3 迁移后 NSPredicate 崩溃【英文标题】:NSPredicate crash after swift 3 migration 【发布时间】:2016-11-18 21:12:19 【问题描述】:迁移到 swift3 后,我遇到了一个无法修复的问题
let fetchRequest: NSFetchRequest<User> = User.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "id == %@", id)
我的应用程序在第二行崩溃,访问不正确,没有原因。类型是正确的,没有日志,什么都没有,只是访问不正确。有什么建议么?
找到原因,谓词错误,导致id是Int64类型,不知道这个版本的swift需要什么样的谓词
【问题讨论】:
【参考方案1】:%@
格式需要一个 Foundation 对象 作为参数,比较
"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) 开始,可以将 所有 数字类型桥接到 NSNumber
,并实现
SE-0139 Bridge Numeric Types to NSNumber and Cocoa Structs to NSValue。
【讨论】:
FWIW,这意味着谓词总是错误的,而 Swift 3 的变化在于明确它是错误的。 @TomHarrington 这很有趣,因为一切正常以上是关于swift 3 迁移后 NSPredicate 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
我想要 swift3.0 的 NSPredicate 的数组过滤器数组
Swift 3 迁移后不会调用 CollectionViewDelegate 方法
Swift 3.0 和 Xcode 8 迁移后未调用 UITableViewDelegate 方法
Swift 3.0 迁移后的 Project-Swift.h 文件编译相同函数数百次,编译耗时 7 分钟
搜索栏在 swift 3 中不起作用。无法将类型 (_) -> Bool 的值转换为预期的参数类型 NSPredicate