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。
我有一个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。