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

Mar*_*one 26 core-data nspredicate ios swift

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

NSPredicate(format: "date > \(currentDate)")
Run Code Online (Sandbox Code Playgroud)

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

'Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"'
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*mov 54

在swift 3中,谓词变为:

let datePredicate = NSPredicate(format: "date > %@", currentDate as NSDate)
Run Code Online (Sandbox Code Playgroud)

  • 不知道在Swift上使用NSPredicate时,必须显式强制转换为NSDate.谢谢 (3认同)

Ima*_*tit 25

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


#1.NSPredicate init(format:?arguments:?)NSDate实例中使用初始化程序

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

init(format predicateFormat: String, arguments argList: CVaListPointer)
Run Code Online (Sandbox Code Playgroud)

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

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

let date = NSDate()
let predicate = NSPredicate(format: "date > %@", date)
Run Code Online (Sandbox Code Playgroud)

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

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

init(format predicateFormat: String, argumentArray arguments: [Any]?)
Run Code Online (Sandbox Code Playgroud)

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

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

let date = NSDate()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
Run Code Online (Sandbox Code Playgroud)

#3.使用实例转换为的NSPredicate init(format:?arguments:?)初始化程序DateNSDate

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

let date = Date()
let predicate = NSPredicate(format: "date > %@", date as NSDate)
Run Code Online (Sandbox Code Playgroud)

#4.使用实例转换为的NSPredicate init(format:?arguments:?)初始化程序DateCVarArg

使用时Date,您可以NSPredicate通过将Date实例强制转换CVarArg为如下所示的实例:

let date = Date()
let predicate = NSPredicate(format: "date > %@", date as CVarArg)
Run Code Online (Sandbox Code Playgroud)

#5.NSPredicate init(format:argumentArray:)Date实例中使用初始化程序

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

let date = Date()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
Run Code Online (Sandbox Code Playgroud)


Nat*_*ook 22

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

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

let datePredicate = NSPredicate(format: "date > %@", currentDate)
Run Code Online (Sandbox Code Playgroud)