0

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.

Répondre

0

Pas sûr que ce soit ce que vous voulez faire, mais je vous suggère cette solution

extension UIViewController { 

    var defaults: UserDefaults { 
     get { 
      return .standard 
     } 
    } 
} 

et ainsi dans chaque UIViewController que vous pouvez faire self.defaults

Si vous voulez un peu de votre UIViewControllers pour avoir d'autres références, vous pouvez le faire

//create protocol with all vars 
protocol References { 
    var defaults: UserDefaults {get} 
} 

//create extension with default implementation 
extension References { 
    var defaults: UserDefaults { 
     get { 
      return .standard 
     } 
    } 
} 

//add this protocol to all UIViewControllers 
extension UIViewController: References { 
} 

//or create new class with references 
class ReferenceViewController: UIViewController, References { 
} 

//override reference in some view controller if needed 
class AnotherReferencesViewController: UIViewController { //or ReferenceViewController 
    var defaults: UserDefaults { 
     get { 
      //something new 
      return .standard 
     } 
    } 
} 
+0

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. –