为什么 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
赋值左边的firstPlayer
是Int
类型,右边的firstPlayer
是选项类型string?
, 不一样,为什么我用同一个名字没有报错?
//Part 2
var players = ["Alice", "Bob", "Cindy", "Dan"]
var firstPlayer = players.first
if let firstPlayer = firstPlayer {
print(firstPlayer)
}
您不会收到 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
在不同的范围内,因此没有重声明错误。
非常感谢您的时间和关注。
我想知道我是否可以使用相同的名称来清除一个选项值和一个 none 选项一。我做了以下编码
//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)
}
您不会收到 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
在不同的范围内,因此没有重声明错误。