Swift 为什么将此谓词格式转换为';=无';

Swift 为什么将此谓词格式转换为';=无';,swift,core-data,nspredicate,Swift,Core Data,Nspredicate,有人建议这完全是我问题的重复,但是,我的应用程序没有崩溃,我也没有迁移到Swift 3。它只是没有返回任何结果。所以答案基本上是一样的,但我的问题所基于的行为却完全不同 今天早上读了很多文章后,我非常确信这段代码是正确的,应该可以工作: func fetchUnits(weightUnitUid: Int? = nil) -> [WeightUnit] { let fetchRequest = NSFetchRequest(entityName: "WeightUnit")

有人建议这完全是我问题的重复,但是,我的应用程序没有崩溃,我也没有迁移到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过滤器预测//uid==nil

我正在传递0,此时实际上,
weightUnitUid
是0,所以我希望:

uid==0

我知道
%@
应该能够处理NSNumber,这就是我需要的。我错在哪里


谢谢

< p> <代码> %@ < /Cord>格式期望一个基础对象作为参数,为零 被解释为
nil

您可以将整数转换为
NSNumber

let filterPredicate = NSPredicate(format: "uid = %@", weightUnitFilter as NSNumber)
或者改用“long int”格式:

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

嗨@MartinR,谢谢你的回答,但我不认为我的问题是完全重复的。在本例中,解决问题的答案似乎是相同的,但我的应用程序没有崩溃。它只是没有返回任何结果。我也没有迁移到Swift 3。我想如果您尝试使用其他值而不是0,它应该会崩溃。它将带0值的%@解释为nil@Larme,可能是真的。但现在它工作了,我就不去碰它了。:-)谢谢你,马丁。这两个建议都奏效了。我仍然没有得到我期望的结果,但这需要另一个问题。