NSPredicate 与 64 位整数?

Posted

技术标签:

【中文标题】NSPredicate 与 64 位整数?【英文标题】:NSPredicate with 64-bit integers? 【发布时间】:2011-03-25 03:04:46 【问题描述】:

我正在尝试将 NSPredicate 与 64 位数字一起使用,但由于某种原因它失败了。我使用以下字符串创建谓词:

[NSString stringWithFormat:@"UID == %qu", theUID]

而且总是失败。然而,如果我遍历我的对象并比较if ( UID == theUID ),我会发现一个很好。我真的很困惑为什么这不能正常工作。

以上看起来正确吗?我的谓词适用于其他整数甚至字符串。但这似乎失败了。

谢谢!

编辑:太奇怪了...所以我通过以下方式创建我的谓词:

NSPredicate *myPredicate = [NSPredicate predicateWithFormat:myString];

现在,当我打印 myString,然后打印 myPredicate(通过执行 NSLog(@"%@", blah);)时,我得到:

字符串:UID == 17667815990388404861 谓词:UID == 9223372036854775807

都是同一个字符串,为什么不一样?

【问题讨论】:

【参考方案1】:

可能 UID 不是无符号值?

构建谓词的一种更稳健的方法是传入一个 NSNumber:

NSNumber *theUIDNum = [NSNumber numberWithUnsignedLongLong:theUID];
[NSString stringWithFormat:@"UID == %@", theUID]

这使您能够调试并打印出 UINum 的值,以确保它获得正确的转换。

【讨论】:

是的,我不久之后尝试过,它给了我同样的结果——这不是很奇怪吗?这是 UID:typedef UInt64 UID; 太奇怪了,如果我使用足够小的 UInt64,例如:0x1FC0000000000051 它可以正常工作,但是更大的整数,例如:0xF1303838000016BB 失败... 你有没有想过这个? 只是一个旁注,我只是想它是未签名的......我应该建议使用 [NSNumber numberWithUnsignedLongLong:] (我刚刚在我的回答中更正了) 看起来谓词无法处理 64 位整数:***.com/questions/8573134/…【参考方案2】:

在您的NSPredicate 中,您可以使用类似的东西

let myNSNumber = NSNumber(value: theUID)
let predicate = NSPredicate(format: "UID = %i", myNSNumber.int64Value)

【讨论】:

以上是关于NSPredicate 与 64 位整数?的主要内容,如果未能解决你的问题,请参考以下文章

一对多关系 iPhone - NSPredicate 核心数据查询

NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配

使用 NSPredicate 查询 CloudKit 以获取空白(或 null 或其他)的日期

整数运算性能 32 与 64 位

x86 OS 的 64 位处理器上的 64 位整数运算

C语言如何将64位整数转字符串