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:字段值类型不匹配