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

Swift 3.0 迁移后的 Alamofire 错误:“调用中的额外参数”(请求方法)