Swift 4.1 - подкласс uiimage

Я получаю ошибку Overriding non-@objc declarations from extensions is not supported, когда подкласс UIImage с пользовательским init после обновления до Swift 4.1

class Foo: UIImage {

    init(bar: String) { }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // Overriding non-@objc declarations from extensions is not supported
    required convenience init(imageLiteralResourceName name: String) {
        fatalError("init(imageLiteralResourceName:) has not been implemented")
    }
}

Спасибо за вашу помощь

7
0
1 222
2

Ответы 2

extension UIImage {

    /// Creates an instance initialized with the given resource name.
    ///
    /// Do not call this initializer directly. Instead, initialize a variable or
    /// constant using an image literal.
    required public convenience init(imageLiteralResourceName name: String)
}

Этот метод инициализации объявлен в расширении класса UIImage.

The error pretty much says that if a function is declared in the extension than it can't be overridden in this way

class Foo: UIImage {

}

extension Foo {
    convenience init(bar :String) {
        self.init()
    }
}

var temp = Foo(bar: "Hello")

Таким способом можно было попытаться добиться желаемого результата.

Проблема, по-видимому, вызвана разработанным инициализатором init(bar:), если вы преобразуете его в удобный, класс будет скомпилирован:

class Foo: UIImage {

    convenience init(bar: String) { super.init() }

    // no longer need to override the required initializers
}

Похоже, что после того, как вы добавите назначенный инициализатор (также известный как некомфортный), Swift также принудительно переопределит все необходимые инициализаторы из базового класса. А для UIImage у нас есть тот, который находится в расширении (не знаю, как он туда попал, вероятно, был автоматически сгенерирован, так как я не смог добавить требуемый инициализатор в расширение). И вы сталкиваетесь с обсуждаемой ошибкой компилятора.

Другие вопросы по теме