Подтвердить что ты не робот

Не удалось запросить дату, используя NSPredicate в Swift

Я пытаюсь сделать выборку для дат позже определенной даты. Мой предикат выглядит следующим образом:

NSPredicate(format: "date > \(currentDate)")

Когда я выполнил запрос на выборку, я обнаружил исключение:

'Unable to parse the format string "date > 2015-07-08 03:00:00 +0000"'

Я думал, что смогу сделать такой запрос. Что я делаю неправильно?

4b9b3361

Ответ 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])