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


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

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

1 16

1 ответ:

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

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

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

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