类级变量集总是为零,为啥?
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
【讨论】:
以上是关于类级变量集总是为零,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 ubiquityIdentityToken 总是为零?