NSPredicate МЕЖДУ двумя датами NSInvalidArgumentException - PullRequest
1 голос
/ 09 января 2020

Я хочу создать NSPredicate с ключевым словом BETWEEN для двух дат: мой аргумент e_date является свойством объекта CoreData типа Date

let sd = DateComponents(calendar: Calendar.current,year: 2019, month: 1, day: 1).date!
let ed = DateComponents(calendar: Calendar.current,year: 2020, month: 1, day: 1).date!

let whenPredicate = NSPredicate(format: "e_date BETWEEN %@", [sd, ed])

Я получаю следующее исключение:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Невозможно проанализировать строку формата« e_date BETWEEN% @ »'

Я пытался привести аргументы к Objective - C Печатает, но все равно получает ту же ошибку.

let whenPredicate = NSPredicate(format: "e_date BETWEEN %@", [sd as NSDate, ed as NSDate])
let whenPredicate = NSPredicate(format: "e_date BETWEEN %@", [sd as NSDate, ed as NSDate] as NSArray)

Как правильно использовать NSPredicate с ключевым словом BETWEEN?

* Обновлено *

Я сделал Clean Build Folder и ошибка исчезла.

1 Ответ

1 голос
/ 09 января 2020

Это довольно странно, потому что предикат работает так, как вы его написали:

 let sd = DateComponents(calendar: Calendar.current,year: 2019, month: 1, day: 1).date!
 let ed = DateComponents(calendar: Calendar.current,year: 2020, month: 1, day: 1).date!

 let whenPredicate = NSPredicate(format: "e_date BETWEEN %@", [sd, ed])

 let date = DateComponents(calendar: Calendar.current,year: 2019, month: 10, day: 17).date!

 whenPredicate.evaluate(with: ["e_date": date]) // true

Я подозреваю, что вы можете использовать ошибку < и > и оставить отзыв.

РЕДАКТИРОВАТЬ : Это может быть проблема с базовыми данными, поскольку при использовании методов и типов Objective- C синтаксис все еще корректен и работает ...

let dates : NSArray = [
    DateComponents(calendar: Calendar.current,year: 2018, month: 10, day: 17).date! as NSDate,
    DateComponents(calendar: Calendar.current,year: 2019, month: 10, day: 17).date! as NSDate,
    DateComponents(calendar: Calendar.current,year: 2020, month: 10, day: 17).date! as NSDate,
]

let whenPredicate2 = NSPredicate(format: "SELF BETWEEN %@", [sd, ed])

dates.filtered(using: whenPredicate2)

EDIT2 : я подтверждаю, что с классами Objective- C ваш первоначальный предикат работает ...

@objc class MyEntity : NSObject {
    @objc let e_date : NSDate

    init(_ date: NSDate) {
        self.e_date = date

        super.init()
    }
}

let entities : NSArray = [
    MyEntity(DateComponents(calendar: Calendar.current,year: 2018, month: 10, day: 17).date! as NSDate),
    MyEntity(DateComponents(calendar: Calendar.current,year: 2019, month: 10, day: 17).date! as NSDate),
    MyEntity(DateComponents(calendar: Calendar.current,year: 2020, month: 10, day: 17).date! as NSDate),
]

entities.filtered(using: whenPredicate)
...