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