切换并且在范围内找不到变量

switch and cannot find variable in scope

为什么要在 switch/case 之外创建变量? 例如,此代码将出现错误 Cannot find 'size' in scope:

func sizeCheckNoVar(value: Int) -> String {
        switch value {
        case 0...2:
            let size = "small"
        case 3...5:
            let size = "medium"
        case 6...10:
            let size = "large"
        default:
            let size = "huge"
            
        }
        return size
    }

有一个默认条件,AFIK 涵盖了所有选项。

同时这段代码就可以了:

func sizeCheckVar(value: Int) -> String {
    var size: String
    switch value {
    case 0...2:
        size = "small"
    case 3...5:
        size = "medium"
    case 6...10:
        size = "large"
    default:
        size = "huge"
        
    }
    return size
}

PS 我看到了这个问题 Cannot find variable in scope ,但我想知道 为什么 而不是 如何避免

一对大括号称为作用域.

在 Swift 中(与其他一些语言不同)有一个简单但铁的规则:

  • 在范围内声明的变量 - 在 switch 语句内的特定情况下 - 在其自己的范围内和较低级别可见 - 就像你的第二个例子

  • 在范围外的更高层次上可见——就像你的第一个例子。

您甚至可以将 size 声明为常量,因为它保证会被初始化。

func sizeCheckVar(value: Int) -> String {
    let size: String
    switch value {
      case 0...2: size = "small"
      case 3...5: size = "medium"
      case 6...10: size = "large"
      default: size = "huge"
    }
    return size
}

然而实际上你根本不需要局部变量。立即 return

func sizeCheckVar(value: Int) -> String {
    switch value {
      case 0...2: return "small"
      case 3...5: return "medium"
      case 6...10: return "large"
      default: return "huge"
    }
}

旁注:switch 语句中的冒号也是一种范围分隔符,否则您会在第一个示例中遇到有关重新声明变量的错误。