Sono curioso che ci sia comunque un metodo nel metodo init che imposta le proprietà di istanza della classe . Essenzialmente ho solo una classe che sottovoce UIView, aggiunge alcune sottoview in init e alcune di queste subview sono variabili di istanza della classe.'Uso di self in method call prima che super.init inizializzi self', impossibile inizializzare le proprietà tramite un metodo call
class MyView: UIView {
var collectionView: UICollectionView
convenience init() {
self.init(frame:CGRectZero)
}
override init (frame : CGRect) {
super.init(frame : frame)
addSubviews()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
addSubviews()
}
func addSubviews(){
self.collectionView = UICollectionView()
}
}
Ora il problema arriva che non riesco a chiamare super-init prima di inizializzare le mie classi proprietà interne (Proprietà 'self.collectionView' non inialized a richiesta super.init), ma anche io non posso chiamare mia abitudine metodo per inizializzare quelle variabili prima di super.init, in quanto non può usare self prima di quell'inizializzazione. Mi rendo conto che potrei rendere facoltativa la variabile di istanza, ma sembra meno elegante, poiché so che sarà sempre inizializzata (e ce ne sono molti altri, questa è solo una versione semplificata). C'è un modo per realizzare questo senza rendere tutte le variabili di istanza optionals?
EDIT:
Credo che in ultima analisi, la mia domanda è perché fa rapidi dis-consentono di chiamare un metodo prima di chiamare super.init? Qual è la differenza tra:
override init (frame : CGRect) {
addSubviews()
super.init(frame : frame)
}
final func addSubviews(){
self.collectionView = UICollectionView()
}
e
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
}
Poiché sai che verranno sempre inizializzate, potresti rendere facoltativamente gli optionals non utilizzati. – Moritz
@EricD. Ecco come lo facevi attualmente, ma mi piace il controllo del tempo di compilazione per assicurarci che li stiamo effettivamente impostando tutti –
dare i valori di default delle proprietà – user3441734