CoreData位比较谓词异常:UInt32参数生成错误值求解决方案
解决CoreData位比较谓词的格式符问题
你的问题确实是格式符使用错误导致的:
- 你用的
%i是**有符号整数(int)**的格式符,会把UInt32类型的4095当作有符号整数解析,触发符号扩展后出现了负数结果。 - 要匹配无符号32位整数,应该用
%u格式符(对应unsigned int类型)。
修正后的代码:
private func buildPredicateForMonths(monthFilter: Int16) -> NSPredicate? { let monthFilter32: UInt32 = UInt32(monthFilter) print("monthFilter32: \(monthFilter32)") // 用%u格式符,直接传值而非数组(原代码的数组写法是多余的) let predicate = NSPredicate(format: "(months & %u) != 0", monthFilter32) print("predicate: \(predicate.description)") return predicate }
另外还有个更稳妥的方案:直接传递NSNumber对象,用%@格式符,无需关心整数的符号和位数,CoreData会自动处理类型匹配:
private func buildPredicateForMonths(monthFilter: Int16) -> NSPredicate? { let monthFilterNum = NSNumber(value: UInt32(monthFilter)) print("monthFilterNum: \(monthFilterNum)") let predicate = NSPredicate(format: "(months & %@) != 0", monthFilterNum) print("predicate: \(predicate.description)") return predicate }
这两种方案都能生成你期望的months & 4095 != 0谓词。
内容的提问来源于stack exchange,提问作者Tudor
相关产品推荐
相关产品推荐

