所以我正在读Swift Documentation on Optional Chaining。如果您要看这个话题, 这段代码之后
let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
john.residence?.address = someAddress
他们有点说 ”“不容易发现someAddress
从未得到评估,因为访问常量没有任何副作用” ,当您向下滚动时,它们会将相同的代码块放入函数中,如下所示
func createAddress() -> Address {
print("Function was called.")
let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
return someAddress
}
john.residence?.address = createAddress()
我的问题如下:
由于Optional Binding
,从未在第二个代码中调用过函数createAddress()
,因此从未初始化过someAddress
。
那么,这是否意味着 CODE#1 中的someAddress
也没有初始化,只是分配了一些内存?
我的想法?
代码#1 中的 someAddress
由编译器解释,即为该类的新实例分配内存。内存尚未初始化。只有在我们第一次访问它时,它才会被初始化。
实际上,语句“ someAddress
不会被评估,因为访问常量不会产生任何副作用” 。
有想法吗?
P.S在当前情况下,“访问常量没有任何副作用” 是什么意思?
答案 0 :(得分:2)
createAddress()
,如果john.residence
为nil
,则不会发生可选绑定您的代码。
在第一个示例中,如果john.residence
是nil
,则由于可选的链接而未将已初始化的someAddress
分配给它,但是someAddress
会尽快初始化当您在代码的第一行中使用let someAddress = Address()
调用其初始化程序时。可选链接在这种情况下的唯一区别是,没有任何东西持有对someAddress
的引用,因此与将其分配给另一个对象的residence
属性相比,它将更快地从内存中释放。>
答案 1 :(得分:2)
那么,这是否意味着CODE#1中的someAddress也没有初始化,而是分配了一些内存?
不。在示例1的第一行中对someAddress进行了明确的初始化。苹果告诉您的是,可选地通过链接将该值分配给另一个值不会使您知道成功与否。而该函数包含副作用(即print(“ Function被调用。”)),因此您将能够看到分配从未发生过。
以这种方式考虑-如果运行第一个代码示例,则不会显示任何内容,并且您也不知道是否已分配变量。
如果运行第二个示例,则不会打印任何内容,这使您知道该函数从未运行过。当苹果公司说分配一个常量没有副作用时,这就是苹果的意思。
答案 2 :(得分:1)
在代码1中
someAddress
已初始化并分配了一些内存,但未在可选链接行中对其进行评估
在代码2中
someAddress
未初始化,因为根本没有调用createAddress
两个常量似乎都是本地常量,因此退出本地范围后,代码#1中的内存将被释放。
在上下文中,语句因为访问常量没有任何副作用 ,这意味着您无法查看是否对右侧进行了评估。这就是为什么添加function
示例的原因。