【问题标题】:NSPredicate with 64-bit integers?NSPredicate 与 64 位整数?
【发布时间】: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

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

【问题讨论】:

    标签: objective-c xcode


    【解决方案1】:

    可能 UID 不是无符号值?

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

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

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      相关资源
      最近更新 更多