Просто чтобы добавить к этому, потому что я тоже получал эту ошибку. Прохождение всех этих ответов, кажется, наиболее применимо к работе с пользовательским интерфейсом и раскадровкой. Я знаю, что оригинальный постер действительно работал с пользовательским интерфейсом, но при поиске возможных причин этой ошибки, в основном, все вопросы возвращаются к этому вопросу, когда другие закрываются как дубликаты или просто возникают проблемы с подключением объектов в раскадровке, поэтому я буду добавь мое решение.
Я работал над кодированием веб-службы в 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
Быстрые структуры, которые соединены