Essayer de refactoriser mon code afin d'éviter d'avoir à référencer des instances partagées partout, plutôt que de les injecter via un initialiseur personnalisé. Ma compréhension limitée de l'initilazation chez Swift m'empêche de le faire.Initialisation d'un UIViewController avec des valeurs par défaut composé de singletons
Voici mon ViewController, moins les méthodes et passe-partout:
class LoginVC: UIViewController {
let dataManager: DataManager
let restManager: RestManager
let defaults: UserDefaults
init(defaults: UserDefaults = .standard, dataManager: DataManager = .sharedInstance, restManager: RestManager = .sharedInstance) {
self.defaults = defaults
self.dataManager = dataManager
self.restManager = restManager
super.init(nibName: nil, bundle: nil)
}
}
J'ai fourni des valeurs par défaut qui sont des instances partagées déclarées comme une constante statique dans leurs classes respectives de singleton DataManager et RestManager. A prévu de faire cela dans chaque ViewController qui a ces singletons référencés en eux. Quoi qu'il en soit, mon problème se pose car le compilateur se plaint que je dois fournir un initialiseur init requis (codeur: aDecoder).
Pas de problème, mais après la mise en œuvre ...
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
... le compilateur se plaint une fois de plus, cette fois-ci que
Blockquote Propriété 'self.defaults' non initialisé au super. init call
Ce que je suppose est logique depuis l'initialisation requise? est, pour autant que je sache, un init de délégation (peut-être que je me trompe totalement ici). Je ne sais pas comment passer les paramètres par défaut de mon init personnalisé à la super init de cet initialiseur, ou si c'est même possible.
J'ai essayé une solution de contournement si en changeant les constantes aux variables mutables et en les rendant non emballés implicitement comme ceci:
class LoginVC: UIViewController {
var dataManager: DataManager!
var restManager: RestManager!
var defaults: UserDefaults!
init(defaults: UserDefaults = .standard, dataManager: DataManager = .sharedInstance, restManager: RestManager = .sharedInstance) {
self.defaults = defaults
self.dataManager = dataManager
self.restManager = restManager
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
Cette solution gère en fait de compiler et de construire, mais les application se bloque dès que userDefaults qui sont dans viewDidLoad sont déballés car ils ont une valeur nulle. Tous ont des valeurs nulles, même si elles sont par défaut dans les paramètres de l'initialiseur personnalisé, ce qui me porte à croire que j'ai royalement foiré.
Toute aide/clarification serait grandement appréciée, merci d'avance.
Merci pour l'idée de leur injection via Protocols, j'ai implémenté cela et il fonctionne comme un charme! Je ne sais toujours pas pourquoi mon chemin n'a pas fonctionné mais merci encore une fois cependant. –