Невозможно запросить дату, используя NSPredicate в Swift
Я пытаюсь сделать выборку для дат позже конкретной даты. Мой предикат выглядит следующим образом:
NSPredicate(format: "date > \(currentDate)")
Когда я выполнил запрос на выборку, я обнаружил исключение:
'Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"'
Я думал, что смогу сделать такой запрос. Что я делаю неправильно?
3 ответа
NSPredicate(format:_:)
принимает строку формата и список аргументов, но вы передаете простую строку. Это не работает, так как этот инициализатор не просто вызывает stringWithFormat:
на параметры, но на самом деле смотрит на информацию о типе аргументов при построении предиката.
Вы можете использовать этот инициализатор, передав дату в качестве аргумента:
let datePredicate = NSPredicate(format: "date > %@", currentDate)
В быстром 3 предикат изменился на:
let datePredicate = NSPredicate(format: "date > %@", currentDate as NSDate)
С Swift 3, в соответствии с вашими потребностями, вы можете выбрать один из 5 следующих шаблонов, чтобы решить вашу проблему.
# 1. С помощью NSPredicate
init(format:arguments:)
инициализатор с NSDate
пример
NSPredicate
имеет инициализатор под названием init(format:arguments:)
который имеет следующую декларацию:
init(format predicateFormat: String, arguments argList: CVaListPointer)
Создает и возвращает новый предикат, подставляя значения в списке аргументов в строку формата и анализируя результат.
При использовании с NSDate
Вы можете установить экземпляр NSPredicate
используя init(format:arguments:)
как указано ниже:
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]?)
Создает и возвращает новый предикат, подставляя значения в массиве в строку формата и анализируя результат.
При использовании с NSDate
Вы можете установить экземпляр NSPredicate
используя init(format:argumentArray:)
как указано ниже:
let date = NSDate()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
# 3. С помощью NSPredicate
init(format:arguments:)
инициализатор с Date
экземпляр приведен к NSDate
При использовании с Date
Вы можете установить экземпляр NSPredicate
бросая свой Date
экземпляр для NSDate
как указано ниже:
let date = Date()
let predicate = NSPredicate(format: "date > %@", date as NSDate)
# 4. С помощью NSPredicate
init(format:arguments:)
инициализатор с Date
экземпляр приведен к CVarArg
При использовании с Date
Вы можете установить экземпляр NSPredicate
бросая свой Date
экземпляр для CVarArg
как указано ниже:
let date = Date()
let predicate = NSPredicate(format: "date > %@", date as CVarArg)
# 5. С помощью NSPredicate
init(format:argumentArray:)
инициализатор с Date
пример
При использовании с Date
Вы можете установить экземпляр NSPredicate
используя init(format:argumentArray:)
как указано ниже:
let date = Date()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])