Подтвердить что ты не робот

Инициализатор не переопределяет назначенный инициализатор из своего суперкласса

Итак, я только что обновился до 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)
    }
}
4b9b3361

Ответ 1

Мое решение - быстрое исправление, но я думаю, что это проще, чем то, что Apple использует в примечаниях к выпуску. Для получения дополнительной информации см. Здесь 19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf. Apple утверждает, что вы создаете файл 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 с параметром frame).

Итак, вам нужно сбросить override. Ой! и обязательно не вызывайте self.init(), или класс никогда не инициализируется (и он выходит из строя после некоторого внутреннего таймаута).

Ответ 2

В соответствии с документацией Apple здесь, то, что вы переопределяете, является инициализатором удобства. Поэтому, чтобы ваш инициализатор работал, вам придется изменить метод на

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

Вы можете либо сделать это, либо удалить инициализатор, если вы на самом деле не используете его, кроме вызова инициализатора суперкласса.

Ответ 3

Я думаю, что это намного проще, чем кажется.

Для 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())
}

Теперь он отлично работает.

Ответ 4

Недавно я понял это, и я хотел бы объяснить, в чем проблема. Первоначально он ответил на форумах разработчиков Apple.

Кажется, Swift изменил стратегию проверки зависимостей инициализатора или для создания инициализаторов.

Теперь, если ваши инициализаторы являются такими, как показано, один из способов обработки как Xcode 6.3 Beta 2, так и Beta 3 - удалить все определения инициализатора:

class CustomButton: UIButton {

    var target: AnyObject!
    var selector: Selector!
    var action: (() -> Void)!    
}

class CustomAlertView: UIViewController {

}

Без определения каких-либо назначенных инициализаторов классы наследуют все инициализаторы своих суперклассов.

Довольно легкое исправление, но большая магия, которая заставила меня замолчать некоторое время.

Ответ 5

Решение для ошибки: переопределить init (coder aDecoder: NSCoder!) не работает, как ожидается - Swift

Это работает для меня, попробуйте это, Примечание: u должен проснуться nib

override func awakeFromNib() {

     super.awakeFromNib()
    // Initialisation code

}