升级到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")
}
}
感谢您的帮助
答案 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
,我们有一个住在扩展中(不确定它是如何到达的,很可能是自动生成的,因为我自己无法在扩展中添加所需的初始化器)。并且您在讨论中遇到了编译器错误。