代码之家  ›  专栏  ›  技术社区  ›  J. Doe

为什么我可以从参数中重新定义变量名?

  •  0
  • J. Doe  · 技术社区  · 6 年前

    我不明白它是如何编译和工作的:

    struct Person {
        var age: Int
    
        init(age: Int) {
            self.age = age
    
            // Another age?!
            let age = age + 1
        }
    }
    

    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 回复  |  直到 6 年前
        1
  •  2
  •   rmaddy    6 年前

    init(child:) ,参数名为 child print deinit 直到最后才被叫来。

    名为 不会更改名为的参数的生存期 小孩 . 但是局部变量确实改变了参数的可见性。第二行:

    var child: Child? = child
    

    但它的寿命没有改变。

        2
  •  1
  •   vadian    6 年前
    • var age: Int
    • init(age: Int) 传递的参数,它隐藏结构成员,除非用 self
    • let age = 是隐藏init参数的局部变量 结构成员。结构成员仍然可用 init 参数不可见但活动。