Build error when trying to override an initializer in Xcode 6.3 Beta 3

放肆的年华 提交于 2019-11-26 23:07:32

问题


The following code shows build error in Xcode 6.3 Beta 3. The code works in Xcode 6.2 and Xcode 6.3 Beta 2.

class MyView: UIView {
  override init() {
    super.init()
    // Some init logic ...
  }

  override init(frame: CGRect) {
    super.init(frame: frame)
  }

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

Error message

initializer does not override a designated initializer from its superclass

Workaround?

There is a possible workaround of creating a protocol with init methods mentioned in Beta 3 release notes. I could not make it work both both init and init(frame: CGRect) initializers.

How can I fix those build errors?


回答1:


A designated initializer of a subclass needs to call the designated initializer of Superclass. A convenience initializer can only call another convenience initializer or a designated initializer of that class.

init() is a convenience initializer for UIView, if you subclass UIView you should call its designated initializer which is init(frame: frame)

override init() {
super.init(frame: frame)
// Some init logic ...
}

EDIT: Apparently in Beta 3, UIView doesn't have convenience initializer called as init, so you need to remove the override keyword too, now this is a designated initializer so you need to call superclass's designated initializer

init() {
super.init(frame: frame)
// Some init logic ...
}

EDIT: Although this works but I think a better way to write this would be:

convenience init() {
self.init(frame:CGRectZero)
}

Source:Swift documentation

Rule 1 A designated initializer must call a designated initializer from its immediate superclass.

Rule 2 A convenience initializer must call another initializer from the same class.

Rule 3 A convenience initializer must ultimately call a designated initializer.




回答2:


swift3 working : @Andrea comment

try to change super.init() in self.init()




回答3:


An additional way of resolving is to provide a default argument for the frame parameter of the UIView

override init(frame: CGRect = CGRectZero) {
     super.init(frame: frame)
     // custom code
}


来源:https://stackoverflow.com/questions/29068534/build-error-when-trying-to-override-an-initializer-in-xcode-6-3-beta-3

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!