为什么要从参数重新定义变量名?

时间:2019-03-17 20:38:47

标签: swift

我不知道它是如何编译和工作的:

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())

“ bye bye”被称为最后一个打印语句。这意味着尽管我看不到如何仍然可以访问参数子对象,但它仍以某种方式保留了引用。

2 个答案:

答案 0 :(得分:2)

init(child:)中,名为child的参数的作用域是整个函数体。该函数的寿命在函数结束时结束。这就是为什么print中的deinit直到结束才被调用的原因。

名为child的局部变量不会更改名为child的参数的生存期。但是局部变量确实会更改参数的可见性。下一行:

var child: Child? = child

您不能再访问名为child的参数,但是其寿命没有改变。

答案 1 :(得分:1)

  • <?php dynamic_sidebar( 'Google Review Widget' ); ?>是(全局)结构成员
  • var age: Int是传递的参数,它将隐藏struct成员,除非它被init(age: Int)引用
  • self是一个局部变量,它隐藏了初始化参数结构成员。 let age =参数不可见但仍有效,而self仍可使用struct成员。