Доступ к константе не имеет побочных эффектов - PullRequest
0 голосов
/ 17 декабря 2018

Итак, я читал Документация Swift по необязательной цепочке .Если вы посмотрите на эту тему, после этого кода

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 как никогда не инициализировалась.

Значит ли это, что someAddress в CODE # 1 также не инициализирован и просто выделен некоторый объем памяти?

Мои мысли ??

someAddress в Код # 1 просто интерпретируется компилятором, т.е. выделяется память для нового экземпляра этого класса.Память еще не инициализирована.Он будет инициализирован только после первого доступа к нему.

На самом деле утверждение "someAddress никогда не оценивается, потому что доступ к константе не имеет побочных эффектов" привел меня сюда.

Мысли?

PS Что означает «доступ к константе не имеет побочных эффектов» означает в контексте текущего сценария?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

В коде # 1

someAddress инициализируется и часть памяти выделяется, но не оценивается в дополнительной строке цепочки

В коде # 2

someAddress не инициализируется, потому что createAddress вообще не вызывается

В любом случае обе константы кажутся локальными, поэтому память в коде # 1 освобождается после выхода из локальной области.


Утверждение , поскольку доступ к константе не имеет побочных эффектов в этом контексте означает, что вы не можете видеть, оценивается ли правая сторона или нет.Вот почему добавлен пример function.

0 голосов
/ 17 декабря 2018

Значит ли это, что someAddress в CODE # 1 также не был инициализирован и просто выделил немного памяти?

Нет.someAddress явно инициализируется в первой строке примера 1. Apple говорит вам, что необязательная цепочка для присвоения этого значения другому значению не даст вам знать, успешно вы это сделали или нет;в то время как функция содержит побочный эффект (то есть print («функция была вызвана.»)), поэтому вы сможете увидеть, что назначение никогда не происходило.

Подумайте об этом так: если вы запускаете первый пример кода, ничего не печатается, и вы не знаете, была ли назначена переменная или нет.

Если вы запустите второй пример, ничего не печатается, что позволяет узнать, что функция никогда не выполнялась.Вот что означает яблоко, когда говорят, что присвоение константы не имеет побочных эффектов.

0 голосов
/ 17 декабря 2018

createAddress() не вызывается из-за необязательного сцепления в случае, если john.residence равно nil, в вашем коде нет необязательного связывания .

В случае, если john.residence равно nil в вашем первом примере, уже инициализированный someAddress не присваивается ему из-за необязательного сцепления, но someAddress инициализируется, как только вы вызываете его инициализатор в первой строкеваш код, используя let someAddress = Address().Единственное отличие, которое делает необязательное сцепление в этом случае, состоит в том, что ничто не содержит ссылку на someAddress, поэтому оно будет освобождено из памяти раньше, чем если бы оно было присвоено свойству residence другого объекта.

...