无法使用Swift中的NSPredicate查询日期

我正在尝试在特定日期之后提取日期。 我的谓词如下:

NSPredicate(format: "date > \(currentDate)") 

当我执行获取请求时,我发现了一个exception:

 'Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"' 

我以为我可以这样做一个查询。 我究竟做错了什么?

NSPredicate(format:_:)采用格式字符串和参数列表,但是您传递的是一个简单的字符串。 这不起作用,因为这个初始化器不只是在参数上调用stringWithFormat:而是在构建谓词时查看参数的类型信息。

您可以通过将日期作为参数传递来使用该初始化程序:

 let datePredicate = NSPredicate(format: "date > %@", currentDate) 

在swift 3中,谓词变为:

 let datePredicate = NSPredicate(format: "date > %@", currentDate as NSDate) 

使用Swift 3,根据您的需要,您可以选择以下5种模式中的一种来解决您的问题。


#1。 使用NSPredicate init(format:​arguments:​) NSPredicate init(format:​arguments:​)程序和NSDate实例

NSPredicate有一个初始化程序,名为init(format:​arguments:​) NSPredicate ,它具有以下声明:

 init(format predicateFormat: String, arguments argList: CVaListPointer) 

通过将参数列表中的值替换为格式字符串并解析结果来创建并返回新谓词。

NSDate使用时,可以使用init(format:​arguments:​) NSPredicate设置NSPredicate实例,如下所示:

 let date = NSDate() let predicate = NSPredicate(format: "date > %@", date) 

#2。 在NSDate实例中使用NSPredicate init(format:argumentArray:)初始化程序

NSPredicate有一个名为init(format:argumentArray:)的初始化程序,它具有以下声明:

 init(format predicateFormat: String, argumentArray arguments: [Any]?) 

通过将给定数组中的值替换为格式字符串并解析结果来创建并返回新谓词。

NSDate使用时,可以使用init(format:​argumentArray:​) NSPredicate设置NSPredicate实例,如下所示:

 let date = NSDate() let predicate = NSPredicate(format: "date > %@", argumentArray: [date]) 

#3。 使用NSPredicate init(format:​arguments:​) NSPredicate init(format:​arguments:​)程序,将Date实例转换为NSDate

Date使用时,可以通过将Date实例强制转换为NSDate来设置NSPredicate实例,如下所示:

 let date = Date() let predicate = NSPredicate(format: "date > %@", date as NSDate) 

#4。 使用NSPredicate init(format:​arguments:​) NSPredicate init(format:​arguments:​)程序,将Date实例转换为CVarArg

Date使用时,您可以通过将Date实例转换为NSPredicate来设置NSPredicate的实例,如下所示:

 let date = Date() let predicate = NSPredicate(format: "date > %@", date as CVarArg) 

#5。 使用NSPredicate init(format:argumentArray:)初始化器和Date实例

Date使用时,可以使用init(format:argumentArray:)设置NSPredicate的实例,如下所示:

 let date = Date() let predicate = NSPredicate(format: "date > %@", argumentArray: [date])