-1

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

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

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

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

if let firstPlayer = firstPlayer赋值的firstPlayer左边是一个Int类型,firstPlayer右边的是一个选项类型string?,它是不同的,为什么我使用相同的名字时没有错误?

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

var firstPlayer = players.first

if let firstPlayer = firstPlayer {
print(firstPlayer)
}

在此处输入图像描述

4

1 回答 1

2

您不会收到重新声明错误,if let因为if 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因此没有重新声明错误。

于 2016-05-06T11:19:38.887 回答