如何存储Swift中的静态变量?
如果我从不调用func useStaticVar()会怎样?这些变量是否已初始化?
如果我调用useStaticVar()然后再从不访问它们会发生什么?的Ar
struct Something {
static var myVariable = 0
static let myConstant = 3
static var myString: String?
static func useStaticVar() {
myVariable = myConstant
myString = String(myVariable)
}
}
答案 0 :(得分:1)
static var myVariable = 0
static let myConstant = 3
已初始化。
myString
在func useStaticVar
中初始化。如果你不打电话,它将保持nil
,因为它是可选的。
static
方法不能被覆盖。
一些有趣的信息是here。
答案 1 :(得分:1)
检查一下: Type Properties
注意强>
与存储的实例属性不同,必须始终提供存储的类型 属性是默认值。这是因为类型本身没有 一个初始值设定项,可以为存储的类型属性赋值 初始化时间。
存储类型属性在首次访问时会被懒惰地初始化。 它们只保证初始化一次,即使访问时也是如此 多个线程同时进行,不需要标记 使用惰性修饰符。
您必须始终为存储的类型属性提供默认值。
您的代码缺少 myString
的默认值,在这种情况下,Swift会为其设置默认值nil
。
存储的类型属性在首次访问时会被懒惰地初始化。
您可以使用以下代码测试并查看存储类型属性的启动方式:
func ZeroGenerator() -> Int {
print(#function)
return 0
}
func ThreeGenerator() -> Int {
print(#function)
return 3
}
func NilGeneartor() -> String? {
print(#function)
return nil
}
struct Something {
static var myVariable = ZeroGenerator()
static let myConstant = ThreeGenerator()
static var myString: String? = NilGeneartor()
static func useStaticVar() {
print(#function)
myVariable = myConstant
myString = String(myVariable)
}
}
Something.useStaticVar()
输出:
useStaticVar()
ZeroGenerator()
ThreeGenerator()
NilGeneartor()
编译器可以对常量默认值进行一些优化,但在语义上没有区别。