为什么在使用变量过滤RealmSwift时Xcode会崩溃?

时间:2018-01-24 07:48:29

标签: swift xcode realm

我已经多次测试了这一点,并且我一直得到与我无关的相同结果。

我想要过滤特定一周的东西。 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") 

任何人都可以解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:2)

问题在于格式化NSPredicate。如果您转到Predicate Format String Syntax,则可以看到:

  

格式字符串支持printf样式的格式说明符,例如%x   (见Formatting String Objects)。两个重要的格式说明符是   %@和%K。

     
      
  • %@是对象值的var arg替换 - 通常是字符串,   号码或日期。
  •   

这意味着您应该转到NSPredicate而不是IntNSNumber(更多信息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)