Я никогда не использовал CloudKit, поэтому, возможно, я ошибаюсь, но…
Две проблемные строки кода, p1=
и p2=
, пытаются создать NSPredicate
с использованием форматастрока.Каждая строка формата содержит две подстановки var arg , или заполнители : %K
и %@
.Таким образом, чтобы это работало, за этим аргументом форматной строки должны следовать два дополнительных аргумента: сначала путь ключа, который должен быть строкой (% K), и второй объект с его значением (% @),Для ваших целей здесь ключевой путь - это, вероятно, просто имя атрибута.
Но вы предоставили только еще один аргумент, объект CKRecord.Reference
, который система пытается проанализировать для первого (имя атрибута, строка) аргумент.Полученная ошибка типична для того, что происходит, когда система пытается проанализировать объект, такой как CKRecord.Reference
, когда она ожидала строку.Swift может быть достаточно безопасным для типов, но устаревшие функции NSPredicate var args не являются:)
Чтобы решить эту проблему (и перейти к следующей), вы должны предоставить аргумент пути к ключу (имя аргумента),что-то вроде этого:
let p1 = NSPredicate(format: "%K == %@", "recordID", CKRecord.Reference(recordID: recID, action: CKRecord_Reference_Action.none))
let p2 = NSPredicate(format: "%K == %@", "recordID", CKRecord.Reference(record: searchRecord, action: CKRecord_Reference_Action.none))
Поскольку я не совсем понимаю, что вы делаете, вам, возможно, придется немного подправить эти две строки.Но дело в том, что, учитывая вашу строку формата, вам нужно три аргумента для NSPredicate(format:)
, а средний должен быть строкой, представляющей путь ключа или имя атрибута.