Просто чтобы добавить к этому, потому что я тоже получал эту ошибку. Прохождение всех этих ответов, кажется, наиболее применимо к работе с пользовательским интерфейсом и раскадровкой. Я знаю, что оригинальный постер действительно работал с пользовательским интерфейсом, но при поиске возможных причин этой ошибки, в основном, все вопросы возвращаются к этому вопросу, когда другие закрываются как дубликаты или просто возникают проблемы с подключением объектов в раскадровке, поэтому я буду добавь мое решение.
Я работал над кодированием веб-службы в Swift 2. Я создал все необходимые прокси-объекты и заглушки. Проходя по возвращенному XML, я динамически создавал экземпляры своих объектов, которые все пришли NSObject
и использовали setValue:forKey
их. Каждый раз, когда setValue:forKey
пытался установить свойство, оно взрывалось с этой ошибкой.
Я имел переключатель заявление для каждого типа я имел дело с (например Bool?
, CShort?
, String?
) и для каждого узла XML я прошел и проверил , что тип был на объекте , а затем преобразуется в значение этого типа и попытался установить его setValue:forKey
.
В конце концов я начал комментировать все эти setValue:forKey
строки и обнаружил, что мой default
случай оператора switch сработал String?
.
В конце концов я понял, что вы не можете использовать необязательные типы swift, setValue:forKey
если они не имеют прямого сопоставления с типом Objective-C, например String?
или NSNumber?
. Я закончил тем, что изменил все CShort?
типы, NSNumber?
так как это имеет прямое отображение. Потому что Bool?
в моем случае это было хорошо для меня, чтобы просто использовать Bool
и инициализировать его false
. Другие могут не иметь такой роскоши.
В любом случае, какая головная боль была такой, надеюсь, это поможет кому-то еще, кто имеет подобную проблему и постоянно перенаправляется на этот вопрос и говорит себе: «Я ничего не делаю в пользовательском интерфейсе !!».
Итак, наконец, еще раз повторить, что Key-Value Coding не работает с опциями. Ниже я в конечном итоге нашел где-то, но я забыл, где так, чтобы кто бы ни опубликовал это, я извиняюсь и воздаю должное, если бы я вспомнил, где я нашел это, но это спасло мою жизнь:
Вы не можете использовать KVC для необязательного свойства Int, поскольку KVC - это Какао / Objective-C, а Objective-C не может видеть необязательный Int - он не соединен с Objective-C. Objective-C может видеть только типы, которые связаны с Objective-C:
типы классов, производные от NSObject
типы классов, предоставляемые с помощью @objc
Быстрые структуры, которые соединены