问题
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()
inself.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