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

Unable to query for date using NSPredicate in Swift

我正在尝试获取晚于特定日期的日期。我的谓词如下:

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

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

'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)

与Swift3、根据您的需要,您可以选择以下5种模式中的一种来解决您的问题。


#1。使用 NSPredicate init(format:​arguments:​) 初始化器和 NSDate 实例

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

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

Creates and returns a new predicate by substituting the values in an argument list into a format string and parsing the result.

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

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

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

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

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

Creates and returns a new predicate by substituting the values in a given array into a format string and parsing the result.

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

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

#3。使用 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:​) 初始值设定项并将 Date 实例转换为 CVarArg

Date 一起使用时,您可以通过将 Date 实例转换为 CVarArg 来设置 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])