Swift 中静态属性和实例属性之间的延迟变量初始化不一致

问题描述 投票:0回答:1
struct MyStruct {
    static var x = myX()
    lazy var y = myY()
}

func myX() -> String {
    print("myX is running")
    return ""
}

func myY() -> String {
    print("myY is running")
    return ""
}

MyStruct.x = "X"
var myStruct = MyStruct()
myStruct.y = "Y"

print("Done")

打印:

myX 正在运行
完成

换句话说,静态惰性变量在分配之前被初始化,而实例属性刚刚被分配。

swift properties lazy-initialization
1个回答
0
投票

我不知道你的问题到底是什么,但对我来说,代码可以使用惰性属性正常工作。

正如 Apple 所描述的 lazy 属性

惰性存储属性是指直到第一次使用时才计算其初始值的属性。您可以通过在声明之前编写惰性修饰符来指示惰性存储属性。

因此,lazy 不能与 static 一起使用,因为 static 总是在您运行应用程序时创建,并且您可以直接访问它。

您输入的示例

struct MyStruct {
    static var x = myX() // this is a static variable so you can freely access into it
    lazy var y = myY() // this is lazy variable so it will not be initialize until used
}

func myX() -> String {
    print("myX is running")
    return ""
}

func myY() -> String {
    print("myY is running")
    return ""
}

如果直接使用

MyStruct.x = "X" // myX is running
MyStruct.y = "y" // can not compile because y is lazy so you can't not directly access into it like static

如果使用 through struct.当您第一次访问变量

y
时,它将初始化惰性变量并导致您的函数
myY()

var myStruct = MyStruct()
print("My struct: ", myStruct.x) // can not compile because this is static value
print("My struct: ", myStruct.y) // myY is running

在另一个世界,就像你的例子

var myStruct = MyStruct()
myStruct.y = "Y"
print("My struct: ", myStruct.y) // Y

编译器不打印

myY is running
的原因是因为在初始化时,您已经用您的值
myY()
覆盖了 func
Y

© www.soinside.com 2019 - 2024. All rights reserved.