Class level 变量设置总是 nil 为什么?

Class level variable set always nil why?

尝试将任何字符串分配给 class 级别变量时,我总是得到 nil。

下面是我的控制台输出:

// test = nil
// 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")
        }
    }
}

当您在 setter 中调用 test 时,调用 getter获取 test 的值。此时,"test" 的值在 UserDefaults 中是 nil。因此,您应该使用 newValue 而不是存储 test,这是您要设置给变量的值。

class Demo {

    class var test: String? {
        set {
            UserDefaults.standard.set(newValue, forKey: "test")
            print("test = \(test)")
        }
        get {
            return UserDefaults.standard.string(forKey: "test")
        }
    }

}

来自文档,

If a computed property’s setter does not define a name for the new value to be set, a default name of newValue is used.

查看 Properties 中的 ComputedProperties 部分以了解 getter 和 setter 的工作原理。

代码使用 test 访问传递给 setter 的值。使用 test 访问 getter,其中 returns 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. For the second one see Computed Properties

https://docs.swift.org/swift-book/LanguageGuide/Properties.html