0

試圖重構我的代碼,以避免必須在整個地方引用共享實例,而我想通過自定義初始化程序注入它們。我對Swift初始化的理解有限讓我無法這樣做。使用默認值初始化UIViewController單身人士

這裏是我的ViewController,減去的方法和樣板:

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

我提供這些共享聲明中的DataManager和RestManager各自的單類靜態常量實例的默認值。打算在每個ViewController中都有這些單引號的引用。無論如何,我的問題出現在編譯器抱怨我必須提供一個必需的初始化程序init(coder:aDecoder)。

沒問題,但實施後...

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

...編譯器再次抱怨,這個時候,

塊引用屬性 'self.defaults' 不超初始化。初始化電話

我認爲自從所需的init有意義嗎?據我所知,是一個委託初始化(可能是我在這裏完全錯誤)。我不知道如何將我的自定義init的默認參數傳遞給此初始化器的超級初始化,或者甚至可能。

我已經改變常數可變的變量,並通過使它們雖然試圖解決方法隱含解開,像這樣:

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

此變通方法實際上管理的應用程序崩潰儘快userDefaults編譯和構建,但因爲它們有一個零值,所以它們在viewDidLoad中被解包。他們都沒有價值,儘管他們默認的自定義初始值設定項的參數讓我相信我已經大肆宣傳。

任何幫助/澄清將不勝感激,在此先感謝。

回答

0

不知道這是你想要做什麼,但我會建議你這個解決方案

extension UIViewController { 

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

,因此在每個UIViewController你可以做self.defaults

如果你希望自己的某些UIViewControllers的有另一個參考,你可以做到這一點

//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

感謝的想法注入他們通過協議,我已經實現了這一點,它就像一個魅力!仍然不知道爲什麼我的方式不起作用,但再次感謝。 –