Swift 似乎逐行计算标识符识别:
print(fox) // Error: Use of unresolved identifier 'fox'
let fox = "🦊"
但是,do
block 中发生了奇怪的事情:
do {
print(dog) // Error: Use of local variable 'dog' before its declaration
let dog = "🐶"
}
编译器如何在尝试打印后知道我要声明 dog
? do
block 中标识符识别的处理方式不同吗?
最佳答案
看起来 Swift 编译器会根据其范围以不同方式处理未定义的标识符。
fox
和dog
变量之间的区别在于作用域。它不特定于 do
block :任何类型的 block 都会将 undefined variable 的分类从“未解析的标识符”(全局范围)更改为“声明前的局部变量”(局部范围)。
以下是出现相同错误的其他方法:
_ = {
print(fox) // Error: Use of local variable 'fox' before its declaration
let fox = "🦊"
}
func foo() {
print(fox) // Error: Use of local variable 'fox' before its declaration
let fox = "🦊"
}
class Bar {
func bar() {
print(fox) // Error: Use of local variable 'fox' before its declaration
let fox = "🦊"
}
}
我猜测发生这种情况的原因是编译器在报告错误之前等待局部作用域结束,而立即报告全局作用域中的错误。这是一个很好的权衡,因为本地范围的结尾通常不需要扫描整个翻译单元一直到结尾。
关于swift - Swift 3.1 中 `do` block 内的标识符识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45103838/