#ios #swift #core-data #nspredicate
#iOS #swift #core-данные #nspredicate
Вопрос:
У меня есть простой предикат, подобный этому, для извлечения всех объектов кода из Core Data:
let predicate = NSPredicate(format: "code.state != %@ AND code.validity != %d AND code.validity < %ld", "ACCEPTANCE", 0, Date().timeIntervalSince1970 * 1000)
Теперь внутри cellForRow
я печатаю то, что у меня есть:
print(" ")
print(product.code)
print(product.code?.state)
let a = product.code?.validity ?? 0
print(a)
print(Date().timeIntervalSince1970 * 1000)
print(Double(a) < Date().timeIntervalSince1970 * 1000)
И тогда я получаю следующий результат:
code.state != "ACCEPTANCE" AND code.validity != 0 AND code.validity < 4789427390557216924
ааа Необязательно ("УПАКОВАНО") 1614253260000 1612447824663.5361 false испытание продукта 5 Необязательно ("УПАКОВАНО") 1616880420000 1612447824672.909 false Produkt testowy 1 Необязательно ("РАСПАКОВАНО") 1611788400000 1612447824678.4438 true qqq Необязательно ("РАСПАКОВАНО") 1612306800000 1612447824702.927 true тестовый телефон 2 Необязательно ("РАСПАКОВАНО") 1612393200000 1612447824718.4958 true
Как вы можете видеть, два из них печатаются как false . Итак, почему они извлекаются, пока они этого не сделали?
Комментарии:
1. @MartinR ты, как всегда, гений;) Спасибо, это работает…
Ответ №1:
Проблема в том, что %ld
формат в предикате не соответствует типу аргумента (который является a Double
). У вас есть следующие варианты:
%f
с помощьюDouble
,%ld
с помощьюInt
,%@
с помощью anNSNumber
это наименее подверженный ошибкам метод.
Примеры:
NSPredicate(format: "code.validity < %f", Date().timeIntervalSince1970 * 1000)
NSPredicate(format: "code.validity < %ld", Int(Date().timeIntervalSince1970 * 1000))
NSPredicate(format: "code.validity < %@", NSNumber(value: Date().timeIntervalSince1970 * 1000))
Комментарии:
1. не могли бы вы, пожалуйста, проверить мой вопрос? Мне нужно ваше решение в качестве вакцины: (