Подтвердить что ты не робот

Swift 4 "Этот класс не соответствует кодированию ключевого значения"

У меня есть библиотека Swift, которая сильно зависит от obj.valueForKey() от NSObject.

После перехода на Swift 4 я обнаружил, что эти вызовы всегда вылетают с ошибкой "этот класс не является ключевым значением, совместимым с кодировкой для ключа...", если свойство, которое я ищу, объявлено с помощью @objc.

Обязательно ли объявлять свойства с помощью @objc для их поиска с помощью этого метода? Есть ли альтернатива?

4b9b3361

Ответ 1

Когда вы выполнили миграцию, Xcode спросила о выводе @objc, и вы, вероятно, выбрали новый тип вместо Swift3.

Возможные решения:

Использовать @objc

Используйте @objc для каждого метода, если это необходимо, а не для всего класса.

Использовать @objcMembers

Вы можете просто использовать @objcMembers для класса.

Применение атрибута @objcMembers к классу неявно добавляет атрибут @objc ко всем его совместимым членам Objective-C.

Написание быстрых классов и протоколов с Objective-C Поведение

Имейте в виду: поскольку применение атрибута @objc может увеличить скомпилированный размер приложения и неблагоприятно повлиять на производительность, применять атрибут @objcMembers только при объявлениях, когда каждый член должен применять атрибут @objc.

Переключить вывод на прежнее поведение

Вы также можете изменить поведение проекта в: Build Settings > Swift 3 @objc Inference > On/Off

Похожие вопросы: