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