swift - Swift 3.1 中 `do` block 内的标识符识别

标签 swift swift3 scope

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 = "🐶"
}

编译器如何在尝试打印后知道我要声明 dogdo block 中标识符识别的处理方式不同吗?

最佳答案

看起来 Swift 编译器会根据其范围以不同方式处理未定义的标识符。

foxdog 变量之间的区别在于作用域。它不特定于 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/

相关文章:

swift - 如何使用可选键访问字典值?

ios - 如何预选和突出显示 UICollectionView 中的单元格

ruby - block 局部变量的存在只是为了增强可读性吗?

javascript - 尝试保持输入参数不变

java - 在 Java 中创建静态单例模式

swift - UICollectionView 中 cellForItemAt 的滚动单元格问题

Swift 游戏错误信息

ios - Swift 中静态 TableView 中特定单元格的公开指示器

swift - 将 AWS DynamoDB 代码更新到 Swift 3 会导致错误

ios - UIcollectionView 的约束