类级变量集总是为零,为啥?

Posted

技术标签:

【中文标题】类级变量集总是为零,为啥?【英文标题】:Class level variable set always nil why?类级变量集总是为零,为什么? 【发布时间】:2018-11-23 07:00:11 【问题描述】:

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

【问题讨论】:

【参考方案1】:

当您在 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")
        
    



来自文档,

如果计算属性的 setter 没有为新属性定义名称 要设置的值,使用默认名称newValue

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

【讨论】:

我已根据您的建议编辑了我的问题,请检查。 @user3686123 请仔细阅读答案。并且不要用答案编辑问题。【参考方案2】:

代码使用test 访问传递给setter 的值。使用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

【讨论】:

以上是关于类级变量集总是为零,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我重载数组运算符时我的私有变量为零? [关闭]

Python 装饰器添加类级变量

快速灵活的变量始终为零

为啥 ubiquityIdentityToken 总是为零?

为啥 self.navigationItem.backBarButtonItem 总是为零?

为啥 tableview rowAtindexpath 中的 viewWithTag 总是为零?