Добавление NSCoding в качестве расширения

Я хотел бы расширить класс framework (я не хочу напрямую редактировать исходный код) и сделать его соответствующим NSCoding.

В принципе, здесь упрощение ситуации, в которой я нахожусь:

/* Can't be edited. */
class Car: NSObject {
    var color: String?
}

/* Can be edited */
extension Car: NSCoding {
    init(coder aDecoder: NSCoder) {
    }

    func encodeWithCoder(aCoder: NSCoder) {
    }
}

Проблема init(coder aDecoder: NSCoder) есть, как в файле заголовка, designated initializer (разве это не странно, но не должно быть convenience initializer?). Однако documentation говорит, что расширение не может добавить новый назначенный инициализатор.

Мой английский не идеален и, может быть, я что-то пропустил... Или это действительно невозможно?

Ответы

Ответ 1

Как и в документации, расширения не могут добавлять новые назначенные инициализаторы. Что делать, если есть частные свойства, требующие инициализации? Было бы невозможно правильно инициализировать тип. Вы можете добавить инициализаторы удобства в расширение, поскольку по своей природе они должны вызывать назначенный инициализатор.

Кроме того, init (coder aDecoder: NSCoder) указан как назначенный инициализатор, потому что это целый другой путь к созданию экземпляра. Например, возьмите UIViewController, он может быть создан с использованием простого кода или может быть создан из файла XIB.

В конце концов, невозможно добавить расширение, реализующее NSCoding.

Возможно, вы можете создать класс-оболочку, содержащий этот класс, и внедрить NSCoding.