Добавление 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 ответ:
Как и сказано в документации, расширения не могут добавлять новые назначенные инициализаторы. Что, если существуют частные свойства, которые нуждаются в инициализации? Было бы невозможно правильно инициализировать тип. Вы можете добавить инициализаторы удобства в расширение, потому что по своей природе они должны вызывать назначенный инициализатор.
Кроме того, init(coder aDecoder: NSCoder) определяется как назначенный инициализатор, поскольку это совершенно другой путь к созданию экземпляра. Бери Например, UIViewController может быть создан с помощью простого кода или из файла XIB.
В конце концов, невозможно добавить расширение, которое реализует NSCoding.
Возможно, вы можете создать класс-оболочку, содержащий этот класс, и заставить его реализовать NSCoding.