2016-08-03 34 views
0

之外init方法我有一個迅速類斯威夫特初始化存儲屬性類問題

class ApplicationManager { 

var fanMode: FanMode 

init() 
{ 
    self.applyDefaultSettings() 
} 

func applyDefaultSettings() 
{ 
    if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode { 
    self.fanMode = unwrappedFanMode 
    } 
} 

} 

上面的代碼拋出了這個問題:

Use of 'self' in method call 'applyDefaultSettings' before all stored properties are initialized 

我應該怎麼做嗎?所以消息說我需要在調用任何其他類的方法之前初始化所有存儲的屬性。所以這意味着在init方法中,我應該初始化至少fanMode屬性。但我希望有一種方法爲我的屬性應用一種默認設置,以提供簡單的可讀性和乾淨的代碼體系結構。但也許可以使用類的初始化器來初始化所有需要的字段。

+0

看看,在你的代碼邏輯可能的情況下,fanMode將被初始化。 –

回答

3

您還可以通過使用此代碼做到這一點:

var fanMode: FanMode = { 
    if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode { 
     return unwrappedFanMode 
    } else { 
     return FanMode()//some default implementation 
    } 
}() 

它可以根據需要進行讀取。

2

根據Apple文檔,Swift不允許您保留未初始化的變量或常量。如果你想設置一些默認設置,然後給你的變量分配初始值,這些初始值將作爲你的默認設置,然後你可以改變它們。

2

所有實例屬性都必須在init方法中初始化。您可以初始化移動到initdefaultMode將成爲您的默認值,如果userDefaults爲nil):

init() { 
    fanMode = (userDefaults?.valueForKey(Consts.kStoredFanMode) as? FanMode) ?? defaultMode 
} 

設置該屬性的默認值,例如:

var fanMode: FanMode = defaultMode 

或者你可以讓你的fanMode可空:

var fanMode: FanMode? = nil 
3

您可以使用隱含解包可選。只需在變量聲明中添加一個!即可。

class ApplicationManager { 

var fanMode: FanMode! //Implicitly unwrapped optional. 

init() 
{ 
    self.applyDefaultSettings() 
} 

func applyDefaultSettings() 
{ 
    if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode { 
    self.fanMode = unwrappedFanMode 
    } 
} 

} 

基本上它的技巧的Xcode成告訴它「喂這個變量初始化和值永遠不會爲零」。但是你要小心使用它們,就好像它確實沒有你的程序會崩潰一樣。但在你的情況下,它應該沒問題,因爲你在init方法中初始化它,所以它在使用它之前永遠不會是零。

+0

在給出的例子中,這個直接初始化可能是正確的選擇,但是如果你希望你的applyDefaultSettings()函數依賴於傳遞給init函數的參數,你將會丟失。您的答案在這裏提供了正確的答案,並防止代碼重複。我確實認爲如果swift想要這麼嚴格,它也應該進行推理,並檢查是否所有存儲的屬性都可以在applyDefaultSettings()中初始化。但是然後一個函數可以被覆蓋,並且東西仍然會失敗....無論如何,好的答案! – Hans