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

时间:2016-08-03 09:24:44

标签: swift swift2

我有一个快速的课程

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属性。但我希望有一种方法可以为我的属性应用一些默认设置,以提供简单的可读性和干净的代码架构。但也许可以使用类的初始化程序来初始化所有需要的字段。

4 个答案:

答案 0 :(得分:3)

您也可以使用以下代码:

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

它可以随意阅读。

答案 1 :(得分:3)

您可以使用implicity unwrapped可选项。只需在变量声明中添加!

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告诉它"嘿这个变量被初始化,值永远不会是nil"。但是你要小心使用这些,好像它确实是零,你的程序将崩溃。但是在你的情况下它应该没问题,因为你在init方法中初始化它所以在使用之前它永远不会是nil。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

var fanMode: FanMode = defaultMode

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

var fanMode: FanMode? = nil