静态变量如何存储在Swift的内存中?

时间:2015-10-16 18:49:42

标签: swift

如何存储Swift中的静态变量?

  1. 如果我从不调用func useStaticVar()会怎样?这些变量是否已初始化?

  2. 如果我调用useStaticVar()然后再从不访问它们会发生什么?的Ar

    struct Something {
        static var myVariable = 0
        static let myConstant = 3
        static var myString: String?
    
        static func useStaticVar() {
            myVariable = myConstant
            myString = String(myVariable)
        }
    }
    

2 个答案:

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

编译器可以对常量默认值进行一些优化,但在语义上没有区别。