【问题标题】:switch and cannot find variable in scope切换并且在范围内找不到变量
【发布时间】:2022-01-05 00:51:26
【问题描述】:

为什么要在 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,但我想知道为什么而不是如何避免

【问题讨论】:

  • 因为当你在case内部创建变量时,变量的作用域在case内部,不能访问case外部的变量
  • 为了简单的方法直接从 case 0..2 中返回值:返回“small”……不需要任何变量

标签: swift xcode switch-statement


【解决方案1】:

一对大括号称为范围

在 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 语句中的冒号也是一种范围分隔符,否则在第一个示例中您会收到有关重新声明变量的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多