我不知道它是如何编译和工作的:
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”被称为最后一个打印语句。这意味着尽管我看不到如何仍然可以访问参数子对象,但它仍以某种方式保留了引用。
答案 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成员。