Почему я могу переопределить имя переменной из параметра? - PullRequest
0 голосов
/ 17 марта 2019

Я не понимаю, как это компилируется и работает:

struct Person {
    var age: Int

    init(age: Int) {
        self.age = age

        // Another age?!
        let age = age + 1
    }
}

Как компилятор может увидеть разницу между этими тройными переменными с одинаковыми именами внутри одного блока?После того как я определил age в последний раз, могу ли я по-прежнему обращаться к age из списка параметров?

Закончится ли время жизни переменной параметра, когда другая переменная будет создана с тем же именем?Я не думаю, что в соответствии с этим небольшим тестом:

struct Person {
    init(child: Child) {
        print("copied another child reference")
        var child: Child? = child

        print("Emptying reference")
        child = nil
        print("Bye bye hasn't been called yet, but where is the last reference?")
    }
}

class Child {
    deinit {
        print("bye bye")
    }
}

// Somewhere call Person(child: Child())

"пока пока" называется последним оператором печати.Это означает, что он каким-то образом сохраняет ссылку, хотя я не вижу, как я все еще могу получить доступ к параметру дочернего объекта.

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

В init(child:) параметр с именем child ограничен для всего тела функции. Его время жизни заканчивается, когда заканчивается функция. Вот почему print в deinit не вызывается до конца.

Локальная переменная с именем child не меняет время жизни параметра с именем child. Но локальная переменная меняет видимость параметра. После строки:

var child: Child? = child

вы больше не можете получить доступ к параметру с именем child, но его время жизни не изменилось.

1 голос
/ 17 марта 2019
  • var age: Int (глобальный) член структуры
  • init(age: Int) - переданный параметр, который скрывает член структуры, если на него не ссылается self
  • let age = - локальная переменная, которая скрывает параметр init и член структуры. Член структуры по-прежнему доступен с self, в то время как параметр init невидим, но жив.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...