访问常量没有任何副作用

时间:2018-12-17 17:40:59

标签: swift constants

所以我正在读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在当前情况下,“访问常量没有任何副作用” 是什么意思?

3 个答案:

答案 0 :(得分:2)

由于可选链接而未调用

createAddress(),如果john.residencenil,则不会发生可选绑定您的代码。

在第一个示例中,如果john.residencenil,则由于可选的链接而未将已初始化的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示例的原因。