【发布时间】:2017-09-16 20:39:00
【问题描述】:
我收到此错误消息,但我不明白为什么。这是来自我继承的一个项目,该项目正在使用这个名为 SwiftyOnboardOverlay 的 pod。我读过类似的问题,但似乎没有一个能为我解决这个问题。
超类 init 的名称与我收到的错误名称相同,如您所见。
错误信息: “初始化器不会覆盖其超类中指定的初始化器”
class WalkthroughOverlay: SwiftyOnboardOverlay {
...
override init(frame: CGRect) {//error here
super.init(frame:frame)
setupViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
...
}
还有父初始化器
open class SwiftyOnboardOverlay: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
setUp()
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
编辑 1:
截图:
这里发生了什么?感谢您的帮助。
编辑2:
好的,所以以前的开发人员也有这些带有便利初始化程序的扩展:
extension UIView {
/// EZSwiftExtensions
public convenience init(x: CGFloat, y: CGFloat, w: CGFloat, h: CGFloat) {
self.init(frame: CGRect(x: x, y: y, width: w, height: h))
}
/// EZSwiftExtensions, puts padding around the view
public convenience init(superView: UIView, padding: CGFloat) {
self.init(frame: CGRect(x: superView.x + padding, y: superView.y + padding, width: superView.w - padding*2, height: superView.h - padding*2))
}
/// EZSwiftExtensions - Copies size of superview
public convenience init(superView: UIView) {
self.init(frame: CGRect(origin: CGPoint.zero, size: superView.size))
}
}
【问题讨论】:
-
我将您的代码复制到了 Swift 游乐场。我删除了对
setup和setupViews的调用。我得到的唯一错误是WalkthroughOverlay需要实现所需的init?(coder:)方法。 -
谢谢 rmaddy。编辑了问题。 init?(coder:) 已实现。
-
是的,就像我说的那样,它是我继承的代码。那个 init 不在我展示的类中,但我现在会寻找它。你似乎强调马特。那是真正的代码,我只是不想粘贴整个课程,所以我复制粘贴了我认为相关的内容。
-
您是否需要将“public”关键字添加到您的子类所需的 init?() 定义中?我记得在某处读过,您不能对覆盖的访问权限低于超类函数的访问权限。 (或者只是从第一个子类的 init 中删除 public?()鉴于它是开放的)