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 正在运行
完成
换句话说,静态惰性变量在分配之前被初始化,而实例属性刚刚被分配。
我不知道你的问题到底是什么,但对我来说,代码可以使用惰性属性正常工作。
正如 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
。