斯威夫特初始化存储属性类问题
之外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属性。但我希望有一种方法为我的属性应用一种默认设置,以提供简单的可读性和干净的代码体系结构。但也许可以使用类的初始化器来初始化所有需要的字段。
您还可以通过使用此代码做到这一点:
var fanMode: FanMode = {
if let unwrappedFanMode = userDefaults.valueForKey(Consts.kStoredFanMode) as? FanMode {
return unwrappedFanMode
} else {
return FanMode()//some default implementation
}
}()
它可以根据需要进行读取。
根据Apple文档,Swift不允许您保留未初始化的变量或常量。如果你想设置一些默认设置,然后给你的变量分配初始值,这些初始值将作为你的默认设置,然后你可以改变它们。
所有实例属性都必须在init
方法中初始化。您可以初始化移动到init
(defaultMode
将成为您的默认值,如果userDefaults
为nil):
init() {
fanMode = (userDefaults?.valueForKey(Consts.kStoredFanMode) as? FanMode) ?? defaultMode
}
设置该属性的默认值,例如:
var fanMode: FanMode = defaultMode
或者你可以让你的fanMode可空:
var fanMode: FanMode? = nil
您可以使用隐含解包可选。只需在变量声明中添加一个!
即可。
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方法中初始化它,所以它在使用它之前永远不会是零。
在给出的例子中,这个直接初始化可能是正确的选择,但是如果你希望你的applyDefaultSettings()函数依赖于传递给init函数的参数,你将会丢失。您的答案在这里提供了正确的答案,并防止代码重复。我确实认为如果swift想要这么严格,它也应该进行推理,并检查是否所有存储的属性都可以在applyDefaultSettings()中初始化。但是然后一个函数可以被覆盖,并且东西仍然会失败....无论如何,好的答案! – Hans
看看,在你的代码逻辑可能的情况下,fanMode将被初始化。 –