Swift 初始化存储 属性 在 class 问题的初始化方法之外

Swift initialization stored property outside init method of class issue

我有一个swiftclass

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

我应该在这里做什么?因此,正如消息所说,我需要在调用 class 的任何其他方法之前初始化所有存储的属性。所以这意味着在 init 方法中我应该至少初始化 fanMode 属性。但我希望有一种方法可以为我的属性应用某种默认设置,以提供简单的可读性和干净的代码架构。但也许可以使用 class 的初始化程序来初始化所有需要的字段。

根据 Apple 文档,Swift 不允许您留下未初始化的变量或常量。如果您想设置一些默认设置,请为您的变量分配初始值,这些初始值将作为您的默认设置,稍后您可以更改它们。

所有实例属性必须在init方法中初始化。您可以将初始化移动到 init(如果 userDefaults 为 nil,defaultMode 将是您的默认值):

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

为 属性 设置一个默认值,例如:

var fanMode: FanMode = defaultMode

或者你可以让你的 fanMode 可以为空:

var fanMode: FanMode? = nil

您也可以使用以下代码来完成:

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

想读就读。

您可以使用隐式解包可选。只需在变量声明中添加一个!

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 告诉它 "Hey this variable is initialized and value will never be nil"。但是你要小心使用它们,就好像它确实是零一样你的程序会崩溃。但在你的情况下应该没问题,因为你在 init 方法中初始化它,所以在使用它之前它永远不会为 nil。