初始化程序不会覆盖超类的指定初始化程序

所以我刚刚升级到了Xcode 6.3 Beta 3,并且出现了很多与以下相关的错误:

初始化程序不会覆盖超类的指定初始化程序。

override init() { super.init() } 

例如,这是一个UIButton类:

 class CustomButton: UIButton { var target: AnyObject! var selector: Selector! var action: (() -> Void)! override init() { // Initializer does not override a designated initializer from its superclass super.init() // Must call a designated initializer of the superclass 'UIButton' } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override init(frame: CGRect) { super.init(frame: frame) } } 

这是我的UIViewController类之一:

 class CustomAlertView: UIViewController { required init(coder aDecoder: NSCoder) { fatalError("NSCoding not supported") } required override init() { // Initializer does not override a designated initializer from its superclass super.init() // Must call a designated initializer of the superclass 'UIViewController' } override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } } 

我的解决scheme是一个快速解决scheme,但我认为比“发行说明”中苹果公司的目标更容易。 欲了解更多信息,请点击这里search19775924 http://adcdownload.apple.com/Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf 。 苹果所说的是你创build了一个Objective-C文件并将其扩展(不得不将其添加到头文件和所有文件中),而且它是“Xcode 6.3 beta 3中的已知问题”,所以我认为很容易做到我所做的:

这是我如何修复它的UIButton

 class CustomButton : UIButton { init() { super.init(frame: CGRectZero) } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 

这是我的ViewControllers之一(如果不需要,删除公共):

 public class GenericViewController: UIViewController { public init() { super.init(nibName: nil, bundle: nil) } required public init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 

我不使用IB,所以我也有UIView ,因为我做了从viewController (如果不需要,删除公共)的视图:

 public class GenericMenuView: UIView { public init() { super.init(frame: CGRectZero) } public required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 

我需要在视图中特别这样做,因为我有一个setupViews方法,在init上调用的所有子类中重写。 而使用AutoLayout我不需要任何框架(所以我没有用框架参数覆盖init)。

所以看来你必须放弃override 。 哦! 并且一定不要调用self.init()或者这个类永远不会被初始化(并且在一些内部超时之后它会崩溃)。

我认为这比看起来更容易。

对于SKSpriteNode,我是这样做的:

 override init() { let texture = SKTexture(imageNamed: "bgTile") super.init(texture: texture, color: nil, size: texture.size()) } 

问题是init()不是SKSpriteNode的指定初始值设定项。 所以我把它改成:

 override init(texture: SKTexture!, color: UIColor!, size: CGSize) { let texture = SKTexture(imageNamed: "bgTile") super.init(texture: texture, color: nil, size: texture.size()) } 

现在它工作正常。

按照这里的苹果文档,你重写的是一个方便的初始化器。 所以为了你的初始化工作,你将不得不改变方法

 override convenience init() { super.init() } 

你可以这样做,或者如果除了调用超类初始化器之外没有真正使用初始化器,那么就移除初始化器。

我最近明白了这一点,我想解释一下问题所在。 最初在苹果开发者论坛上回答。

看来Swift已经改变了初始化器依赖检查策略或隐式初始化器策略。

现在,如果您的初始化器如上所示,处理Xcode 6.3 Beta 2和Beta 3的一种方法是删除所有初始化器定义:

 class CustomButton: UIButton { var target: AnyObject! var selector: Selector! var action: (() -> Void)! } class CustomAlertView: UIViewController { } 

没有定义任何指定的初始化器,类inheritance了它们超类的所有初始化器。

一个相当简单的修复,但一个让我难倒了一阵子的大难题。

错误的解决scheme:覆盖初始化(编码器aDecoder:NSCoder!)不能像预期的那样工作 – Swift

这适用于我,试试这个,注意:你必须清醒的笔尖

 override func awakeFromNib() { super.awakeFromNib() // Initialisation code }