試圖重構我的代碼,以避免必須在整個地方引用共享實例,而我想通過自定義初始化程序注入它們。我對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中被解包。他們都沒有價值,儘管他們默認的自定義初始值設定項的參數讓我相信我已經大肆宣傳。
任何幫助/澄清將不勝感激,在此先感謝。
感謝的想法注入他們通過協議,我已經實現了這一點,它就像一個魅力!仍然不知道爲什麼我的方式不起作用,但再次感謝。 –