Inicializador no anula un inicializador designado de su superclase


Así que acabo de actualizar a Xcode 6.3 Beta 3 y están apareciendo muchos errores relacionados con lo siguiente:

El inicializador no anula un inicializador designado de su superclase.

override init() {
    super.init()
}

Por ejemplo, esta es una clase 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)
    }
}

Esta es una de mis UIViewController clases:

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)
    }
}
Author: Airspeed Velocity, 2015-03-13

5 answers

Mi solución es una solución rápida, pero creo que es más fácil que lo que Apple pretende en las Notas de la versión. Para más información buscar para 19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf aquí. Lo que Apple dice es que creas un archivo Objective-C y lo extiendes (teniendo que agregarlo a los archivos de encabezado y todo) y está en "Problemas conocidos en Xcode 6.3 beta 3", así que creo que es fácil hacer lo que hice:

Así es como arreglé para UIButton:

class CustomButton : UIButton {
    init() {
        super.init(frame: CGRectZero)
    }

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

Y este es uno de mis ViewController (remove public si no es necesario):

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")
    }
}

No uso IB, así que también tengo UIView, porque separo la vista de la viewController (remove public si no es necesario):

public class GenericMenuView: UIView {
    public init() {
        super.init(frame: CGRectZero)
    }

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

Necesito esto especialmente en views porque tengo un método setupViews que sobrescribo en todas las subclases que se invoca en el init. Y usando AutoLayout no necesito ningún fotograma (así que no anulo el init con el parámetro frame).

Así que parece que tienes que soltar override. Oh! y asegúrese de no llamar a self.init() o la clase nunca se inicializa (y se bloquea después de un tiempo de espera interno).

 41
Author: Lluis Gerard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-18 05:27:54

Según la documentación de Apple aquí, lo que está sobreescribiendo es un inicializador de conveniencia. Así que para que su inicializador funcione, tendrá que cambiar el método a

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

Puede hacer eso, o eliminar el inicializador si realmente no lo está usando, excepto para llamar al inicializador de superclase.

 4
Author: lostInTransit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-03 03:58:09

Creo que esto es mucho más fácil de lo que parece.

Para un SKSpriteNode, estaba haciendo esto:

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

El problema es que init() no es el inicializador designado para SKSpriteNode. Así que lo cambié a:

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

Ahora funciona bien.

 3
Author: user3590685,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-09 11:35:09

Recientemente me di cuenta de esto y me gustaría explicar cuál era el problema. Originalmente respondió en el foros de desarrolladores de Apple .

Parece que Swift ha cambiado la estrategia para la comprobación de dependencias de inicializadores o para la mejora de inicializadores.

Ahora, si sus inicializadores son como se muestra, una forma de lidiar con Xcode 6.3 Beta 2 y Beta 3 es eliminar todas las definiciones de inicializadores:

class CustomButton: UIButton {

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

class CustomAlertView: UIViewController {

}

Sin definir ningún inicializador designado, las clases heredan todos inicializadores de sus superclases.

Una solución bastante fácil, pero una gran trampa que me dejó perplejo por un tiempo.

 1
Author: fuzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-13 11:45:21

Solución para el error: Override init (codificador aDecoder: NSCoder!) no funciona como se espera - Swift

Esto funciona para mí , Prueba esto, Nota: u must awake nib

override func awakeFromNib() {

     super.awakeFromNib()
    // Initialisation code

}
 1
Author: Sanju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-17 10:18:18