为什么这个谓词格式被变成'= nil'

Why is this predicate format being turned into '= nil'

有人建议 与我的问题完全相同,但是,我的应用程序没有崩溃,我也没有迁移到 Swift 3。它只是没有返回任何内容结果。所以解决方案本质上是相同的,但我的问题所基于的行为却大不相同。

今天早上阅读了很多帖子后,我非常有信心这段代码是正确的并且应该可以工作:

func fetchUnits(weightUnitUid: Int? = nil) -> [WeightUnit] {
    let fetchRequest = NSFetchRequest(entityName: "WeightUnit")
    if let weightUnitFilter = weightUnitUid {
        let filterPredicate = NSPredicate(format: "uid = %@", weightUnitFilter)
        fetchRequest.predicate = filterPredicate
    }

但在调试控制台中是这样的:

(lldb) po filterPredicate // uid == nil

我传递的是 0,此时 weightUnitUid 实际上是 0,所以我期望:

uid == 0

我知道 %@ 应该能够处理 NSNumber,而这正是我所需要的。我哪里错了。

谢谢

%@ 格式需要一个 Foundation 对象作为参数,零 被解释为 nil.

您可以将整数转换为 NSNumber:

let filterPredicate = NSPredicate(format: "uid = %@", weightUnitFilter as NSNumber)

或改用 "long int" 格式:

let filterPredicate = NSPredicate(format: "uid = %ld", weightUnitFilter)