Просто до цього додати, бо я також отримував цю помилку. Перебираючи всі ці відповіді, швидше за все, стосується роботи з інтерфейсом користувача та матеріалами розкадрівки. Я знаю, що оригінальний плакат, здається, працює з користувальницьким інтерфейсом, але при пошуку можливих причин цієї помилки, здебільшого всі питання повертаються до цього питання, тому що інші закриваються як дублікати або просто виникають проблеми з підключенням речей на дошці розкадрування, тому я буду додати моє рішення.
Я працював над кодуванням веб-сервісу в Swift 2. Я створив всі необхідні проксі-об'єкти та заглушки. Коли я переходив через повернений XML, я динамічно інстанціював свої об'єкти, які все з’явились NSObject
та використовували setValue:forKey
на них. Кожен раз, коли setValue:forKey
намагався встановити властивість, він вибухнув з цією помилкою.
Я мав перемикач заяву для кожного типу я мав справу з (наприклад Bool?
, CShort?
, String?
) і для кожного вузла XML я пройшов і перевірив , що тип був на об'єкті , а потім перетворюється в значення цього типу і спробував встановити його setValue:forKey
.
Врешті-решт я почав коментувати всі ці setValue:forKey
рядки і виявив, що мій default
випадок заяви переключення дійсно спрацював String?
.
Нарешті я зрозумів, що ви не можете використовувати необов'язкові типи швидкого доступу, setValue:forKey
якщо вони не мають прямого відображення на тип Objective-C, як String?
або NSNumber?
. Я змінив усі CShort?
типи, NSNumber?
оскільки це має пряме відображення. Бо Bool?
в моєму випадку мені було чудово просто використовувати Bool
та ініціалізувати false
. Інші, можливо, не мають такої розкоші.
У будь-якому разі, який головний біль, який так сподівався, допомагає комусь, хто має подібну проблему, і постійно переспрямовується на це питання і каже собі: "Я нічого не роблю в інтерфейсі !!".
Отже, нарешті, повторити ще раз, що кодування Key-Value не працює з додатковими параметрами. Нижче я десь знайшов, але забуваю, де так, хто, хто це опублікував, прошу вибачення і, якщо б я згадав, де це знайшов, але це врятувало моє життя:
Ви не можете використовувати KVC для необов'язкової властивості Int, оскільки KVC - Cocoa / Objective-C, а Objective-C не може бачити необов'язковий Int - він не пов'язаний з Objective-C. Objective-C може бачити лише типи, які з'єднані з Objective-C:
типи класів, які походять від NSObject
типи класів, які піддаються дії @objc
Швидкі споруди, які є мостовими