尝试将任何字符串分配给类级变量时,我总是得到nil。
下面是我的控制台输出:
// test =无
// Demo.test = nil
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Demo.test = "app"
print("Demo.test = \(Demo.test)")
}
}
class Demo {
class var test: String? {
set {
UserDefaults.standard.set(test, forKey: "test")
print("test = \(test)")
}
get {
return UserDefaults.standard.string(forKey: "test")
}
}
}
答案 0 :(得分:5)
在设置程序中调用test
时,将调用 getter 以获取test
的值。此时,UserDefaults中的“ test”值为nil
。因此,您应该使用test
而不是存储newValue
,它是您将要设置为变量的值。
class Demo {
class var test: String? {
set {
UserDefaults.standard.set(newValue, forKey: "test")
print("test = \(test)")
}
get {
return UserDefaults.standard.string(forKey: "test")
}
}
}
从文档中
如果计算属性的设置器未为新属性定义名称 要设置的值,则使用默认名称
newValue
。
检查Properties中的ComputedProperties部分,以了解吸气剂和塞特剂的工作原理。
答案 1 :(得分:4)
代码使用test
访问传递给设置器的值。使用test
访问getter,并返回nil
。
要使用提供给setter的值,请使用编译器生成的变量newValue
。
class Demo {
class var test: String? {
set {
print("test = \(newValue)")
UserDefaults.standard.set(newValue, forKey: "test")
}
get {
return UserDefaults.standard.string(forKey: "test")
}
}
}
或者,您可以声明使用的变量名。
class Demo {
class var test: String? {
set(newTestValue) {
print("test = \(newTestValue)")
UserDefaults.standard.set(newTestValue, forKey: "test")
}
get {
return UserDefaults.standard.string(forKey: "test")
}
}
}
有关第一个示例,请参见Computed Properties, Shorthand Setter Declaration。对于第二个,请参见Computed Properties。
https://docs.swift.org/swift-book/LanguageGuide/Properties.html