Невозможно запросить дату, используя 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. С помощью NSPredicateinit(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. С помощью NSPredicateinit(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. С помощью NSPredicateinit(format:​arguments:​) инициализатор с Date экземпляр приведен к NSDate

При использовании с Date Вы можете установить экземпляр NSPredicate бросая свой Date экземпляр для NSDate как указано ниже:

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

# 4. С помощью NSPredicateinit(format:​arguments:​) инициализатор с Date экземпляр приведен к CVarArg

При использовании с Date Вы можете установить экземпляр NSPredicate бросая свой Date экземпляр для CVarArg как указано ниже:

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

# 5. С помощью NSPredicateinit(format:argumentArray:) инициализатор с Date пример

При использовании с Date Вы можете установить экземпляр NSPredicate используя init(format:argumentArray:) как указано ниже:

let date = Date()
let predicate = NSPredicate(format: "date > %@", argumentArray: [date])
Другие вопросы по тегам