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

3

18

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?

Livingston answered 16/3, 2015 at 1:57 Comment(0)
S
18

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.

Seaquake answered 17/3, 2015 at 23:15 Comment(0)
P
1

swift3 working : @Andrea comment

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

Phuongphycology answered 19/1, 2017 at 14:40 Comment(0)
K
0

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
}
Kaisership answered 10/4, 2015 at 0:50 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.