无法理解 fetchRequest.predicate

can´t understand fetchRequest.predicate

我有一个相当 "simple" 的 NSFetchRequest 谓词:

guard let kategorie = self.fetchedResultsController.objectAtIndexPath(indexPath) as? Kategorien else {
            return
}
let fetchRequest = NSFetchRequest(entityName: "Details")
fetchRequest.predicate = NSPredicate(format: "kategorie == %i", kategorie.katid!)
do {
    let results = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [Details]
...

sqllite-"table"的内容是

变量的内容是

所以从

fetchRequest.predicate = NSPredicate(format: "kategorie == %i", kategorie.katid!)

我得到谓词

kategorie == 18

同时

kategorie.katid is 1

我听不懂:-(

有帮助吗???

这真的很奇怪,但你可以这样做:

NSPredicate(format: "kategorie = \(kategorie.katid!)")

然后您就不必担心是否需要 %i、%ld 或 %@ 等...

katid 是一个(可选的)NSNumber,你的情况会发生什么 是对象的地址的(低32位)被取为整数。

正确的格式 说明符是 %@(对于 NSObject 子类的实例):

 NSPredicate(format: "kategorie == %@", kategorie.katid!)

或者,将对象转换为整数:

NSPredicate(format: "kategorie == %d", kategorie.katid!.intValue)

当然要避免强制展开,例如

NSPredicate(format: "kategorie == %d", kategorie.katid?.intValue ?? 0)

在格式字符串中使用字符串插值(如 @Gargoyle)是这种特殊数字情况下的另一种解决方案, 但不是一般情况:如果你插入一个 string 那么任何百分比 字符将被解释为格式说明符并且导致 意外输出或崩溃。单引号或双引号也会 导致问题,因为这些在谓词中有特殊含义 格式化字符串。