Swift 4.1 - 子类UIImage

时间:2018-04-11 09:53:14

标签: swift uiimage swift4.1

升级到Swift 4.1后使用自定义init子类UIImage时出现Overriding non-@objc declarations from extensions is not supported错误

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")
    }
}

感谢您的帮助

2 个答案:

答案 0 :(得分:4)

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)
}

此init方法在UIiamge类的扩展名上进行了分解。

  

错误几乎说如果在扩展中声明一个函数而不是以这种方式覆盖它

class Foo: UIImage {

}

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

var temp = Foo(bar: "Hello")

你可以尝试以这种方式实现欲望的结果。

答案 1 :(得分:0)

问题似乎是由init(bar:)设计的初始化程序引起的,如果将其转换为方便的初始化程序,则该类将编译:

class Foo: UIImage {

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

    // no longer need to override the required initializers
}

似乎一旦添加了指定的初始值设定项(又称非便利性),Swift还将对基类中所有必需的初始值设定项实施覆盖。对于UIImage,我们有一个住在扩展中(不确定它是如何到达的,很可能是自动生成的,因为我自己无法在扩展中添加所需的初始化器)。并且您在讨论中遇到了编译器错误。