我已经多次测试了这一点,并且我一直得到与我无关的相同结果。
我想要过滤特定一周的东西。 Stuff
是一个领域对象,week
是一个整数。如果过滤器包含整数,则可以使用。
let result = realm.objects(Stuff.self).filter("week < 14")
但是,本周不会事先知道,因此周的正确值存储在变量中。以下两种情况都会因为Xcode崩溃而失败。
let compareweek = 14
let query = NSPredicate(format: "week < %@", compareweek)
let result = realm.objects(Stuff.self).filter(query)
let compareweek = 14
let result = realm.objects(Stuff.self).filter("week < compareweek")
任何人都可以解释这里发生了什么吗?
答案 0 :(得分:2)
问题在于格式化NSPredicate
。如果您转到Predicate Format String Syntax,则可以看到:
格式字符串支持printf样式的格式说明符,例如%x (见Formatting String Objects)。两个重要的格式说明符是 %@和%K。
- %@是对象值的var arg替换 - 通常是字符串, 号码或日期。
这意味着您应该转到NSPredicate
而不是Int
但NSNumber
(更多信息here)。
let compareweek: NSNumber = 14
let query = NSPredicate(format: "week < %@", compareweek)
let result = realm.objects(Stuff.self).filter(query)
最简单的解决方案由@Scriptable提供:
不使用
%@
,而是使用%d
来表示整数。
所以,这也可行:
let compareweek = 14
let query = NSPredicate(format: "week < %d", compareweek)
let result = realm.objects(Stuff.self).filter(query)