为什么 if let unwrapping 没有 Invalid redeclaration 问题

Why there is no Invalid redeclaration issue for if let unwrapping

非常感谢您的时间和关注。

我想知道我是否可以使用相同的名称来清除一个选项值和一个 none 选项一。我做了以下编码

//Part 1
var playerName: String?
var playerName: String

原来是错的。然而,当我使用相同的名称来展开一个选项时(请参阅第 2 部分),编译器根本没有触发任何错误。为什么第 2 部分是正确的而第 1 部分是错误的?

if let firstPlayer = firstPlayer赋值左边的firstPlayerInt类型,右边的firstPlayer是选项类型string?, 不一样,为什么我用同一个名字没有报错?

//Part 2
var players = ["Alice", "Bob", "Cindy", "Dan"]

var firstPlayer = players.first

if let firstPlayer = firstPlayer {
print(firstPlayer)
}

您不会收到 if letif var 的重新声明错误,因为它们创建了一个只能在 if 块中访问的新变量。这个新变量的范围与原来的不同。具有相同名称的新变量隐藏了原始变量,但它仍然存在。块结束后,您可以访问原始变量。

考虑以下示例:

var str: String? = "hello"

if var str = str {
    str = "bye"
    print(str)  // prints "bye"
}

print(str)  // prints "Optional("hello")"

For 循环也创建一个新的作用域:

var i = 17

for i in 1...3 {
    print(i)
}

print(i)

输出:

1
2
3
17

范围的另一个例子是:

class Foo {
    var str: String? = "hello"

    func test() {
        let str = "bye"  // no redeclaration error here either
        print(str)
    }
}

这里,局部变量 str 与 属性 str 在不同的范围内,因此没有重声明错误。