我有一个快速的课程
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 :(得分: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