无法在 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])
我正在尝试获取晚于特定日期的日期。我的谓词如下:
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])