2016-04-08 6 views
1

Dieser Code funktioniert:Es zeigt "required initializer init muss in der Unterklasse von UIControl zur Verfügung gestellt werden:" Wenn ich init (Rahmen: CGRect) außer Kraft setzen

import UIKit 

class wheel: UIControl { 

} 

Aber dieser Code nicht:

class wheel: UIControl { 
override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

Es zeigt den Fehler "erforderlich Initialisierungsinitialisierung muss in Unterklasse von UIControl bereitgestellt werden", wenn ich init (Rahmen: CGRect) überschreiben, aber nicht init(coder aDecoder: NSCoder).

Warum muss ich init(coder aDecoder: NSCoder) implementieren? Und warum muss ich es nicht implementieren, wenn ich init(frame: CGRect) nicht implementiert habe?

fand ich eine ähnliche Position Stack-Überlauf, aber es nicht erklären: Swift : Error: 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'

Antwort

5

Look. Gemäß Apple documentations erben Swift-Unterklassen standardmäßig nicht ihre Superklasseninitialisierer. Sie werden nur unter bestimmten Umständen vererbt. Einer davon ist: Wenn Ihre Unterklasse keine bestimmten Initialisierer definiert, erbt sie automatisch alle ihre übergeordneten Initialisierer. Wenn Sie also init(frame: CGRect) nicht implementieren, werden alle Superinitialisierer vererbt.

Auch UIView übernimmt NSCoding-Protokoll, das einen init(coder:) Initialisierer erfordert. Wenn Sie also init(frame: CGRect) implementieren, erbt Ihre Klasse keine Superinitialisierer mehr. Also müssen Sie das auch implementieren:

required init?(coder decoder: NSCoder) { 
    super.init?(coder: decoder) 
} 
+0

Perfekt klar, vielen Dank !! – allenlinli

+1

Gute Antwort. Aber das Codebeispiel sollte "erforderliche Init?" Anstelle von "Init" sagen. –

Verwandte Themen