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

Ios 无法在Swift中使用NSPredicate查询日期,ios,swift,core-data,nspredicate,Ios,Swift,Core Data,Nspredicate,我正在尝试获取晚于特定日期的日期。我的谓词如下: NSPredicate(format: "date > \(currentDate)") 执行提取请求时,我捕获到一个异常: 'Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"' 我想我可以提出这样的问题。我做错了什么?NSPredicate(format::)接受一个格式字符串和一个参数列表,但传递的是一个简单字符串。这不起作用,因为此初始值

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

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)

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


#1.将
NSPredicate
初始值设定项与
NSDate
实例一起使用
NSPredicate
有一个名为
init(格式:​论据:​)具有以下声明:

init(format predicateFormat: String, arguments argList: CVaListPointer)
init(format predicateFormat: String, argumentArray arguments: [Any]?)
通过将参数列表中的值替换为格式字符串并分析结果,创建并返回新谓词

NSDate
一起使用时,可以使用
init(格式:​论据:​)如下所示:

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

#2.将
NSPredicate
初始值设定项与
NSDate
实例一起使用
NSPredicate
具有名为
init(格式:argumentArray:)
的初始值设定项,该初始值设定项具有以下声明:

init(format predicateFormat: String, arguments argList: CVaListPointer)
init(format predicateFormat: String, argumentArray arguments: [Any]?)
通过将给定数组中的值替换为格式字符串并分析结果,创建并返回一个新谓词

NSDate
一起使用时,可以使用
init(格式:​argumentArray:​)如下所示:

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

#3.使用
NSPredicate
初始值设定项,并将
Date
实例强制转换为
NSDate
Date
一起使用时,您可以通过将
Date
实例强制转换为
NSDate
来设置
NSPredicate
的实例,如下所示:

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

#4.使用
NSPredicate
初始值设定项,并将
Date
实例强制转换为
CVarArg
Date
一起使用时,您可以通过将
Date
实例强制转换为
CVarArg
来设置
NSPredicate
的实例,如下所示:

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

#5.将
NSPredicate
初始值设定项与
Date
实例一起使用 与
Date
一起使用时,可以使用
init(格式:argumentArray:)
设置
NSPredicate
的实例,如下所示:

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

不知道在Swift上使用NSPredicate时必须显式转换为NSDate。谢谢,
currentDate
应该是日期类型,对吗?或者可以是字符串?