类级别的变量总是设置为nil为什么?

时间:2018-11-23 07:00:11

标签: ios swift getter-setter userdefaults

尝试将任何字符串分配给类级变量时,我总是得到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")
        }
    }
}

2 个答案:

答案 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