2015-03-13 9 views
32

Così ho appena aggiornato a Xcode 6.3 Beta 3 e un sacco di errore (s) appaiono relative ai seguenti:Initializer non sovrascrive un inizializzatore designato dalla propria superclasse

Initializer non sovrascrive un inizializzatore designato dalla sua superclasse.

override init() { 
    super.init() 
} 

Per esempio, questo è una classe 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) 
    } 
} 

Questo è uno dei miei UIViewController classi:

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

risposta

39

La mia soluzione è una soluzione rapida, ma penso che sia più facile di quello che Apple intende nelle Note di rilascio. Per ulteriori informazioni, cercare 19775924 http://adcdownload.apple.com//Developer_Tools/Xcode_6.3_beta_3/Xcode_6.3_beta_3_Release_Notes.pdf qui. Quello che Apple dice è che crei un file Objective-C e lo estendi (dovendo aggiungerlo ai file header e tutto) ed è su "Problemi noti in Xcode 6.3 beta 3", quindi penso che sia facile fare ciò che ho fatto :

Ecco come ho riparato per UIButton:

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

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

E questo è uno dei miei ViewControllers (rimuovere pubblico se non necessario):

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

io non uso IB così Ho anche UIView, perché separo la vista dallo viewController (rimuovere pubblico se non necessario):

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

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

ho bisogno di questo specialmente in vista perché ho un metodo che setupViews sovrascrivo in tutte le sottoclassi che si chiama sul init. E usando AutoLayout non ho bisogno di alcun frame (quindi non sovrascrivo init con il parametro frame).

Quindi sembra che devi cadere override. Oh! e assicurati di non chiamare self.init() o la classe non viene mai inizializzata (e si blocca dopo un certo timeout interno).

1

di recente ho capito questo e mi piacerebbe spiegare quale fosse il problema. Originariamente risposto allo Apple Developer forums.

Sembra che Swift abbia cambiato la strategia per il controllo delle dipendenze di inizializzatore o per inizializzare gli inizializzatori.

Ora, se sono riportati i tuoi inizializzatori, un modo per trattare con entrambi Xcode 6.3 Beta 2 e Beta 3 è quello di rimuovere tutte le definizioni di inizializzazione:

class CustomButton: UIButton { 

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

class CustomAlertView: UIViewController { 

} 

senza definire alcun inizializzatori designati, le classi ereditano tutte inizializzatori delle loro superclassi.

Una soluzione piuttosto semplice, ma un grande trambusto che mi ha costretto per un po '.

3

Come per la documentazione Apple here, ciò che si sta ignorando è un inizializzatore di convenienza. Quindi per la vostra inizializzazione al lavoro, si dovrà cambiare il metodo per

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

È possibile farlo, o rimuovere l'inizializzatore se non siete veramente utilizza tranne che per chiamare l'inizializzatore superclasse.

+0

Si dovrebbe , risposta modificata per chiarezza – lostInTransit

3

Penso che sia molto più facile di quanto sembri.

Per uno SKSpriteNode, stavo facendo questo:

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

Il problema è init() non è l'inizializzatore designato per SKSpriteNode. Quindi l'ho appena modificato in:

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

Ora funziona correttamente.

1

Soluzione per errore: Override init (coder aDecoder:! NSCoder) non funziona come previsto - Swift

Questo funziona per me, provate questo, Nota: u deve svegliare pennino

override func awakeFromNib() { 

    super.awakeFromNib() 
    // Initialisation code 

}