一尘不染

Swift中开关盒的穷举状态

swift

苹果文档

每个switch语句必须详尽无遗。也就是说,所考虑类型的每个可能值都必须与切换条件之一匹配。

所以在新的Xcode中,我放置了这样的代码

println(UInt16.min); // Output : '0'
println(UInt16.max); // Output : '65535'

var quantity : UInt16 = 10;

switch quantity {
case 0...65535: //OR case UInt16.min...UInt16.max:
    println();
default:
    println();
}

现在,如果我删除默认部分,则会出现编译器错误:

切换必须详尽无遗
是否要添加丢失的案例?固定

所以我的问题是我提到的一个案例,因为case 0...65535:我没有提到UInt16??的所有案例值。但是我仍然遇到错误?为什么会出现此错误,我错过了什么吗?


阅读 225

收藏
2020-07-07

共1个答案

一尘不染

Swift仅switch在处理enum类型时才真正验证一个块是否完整。即使打开,除了和之外都Bool需要一个default块:true``false

var b = true
switch b {
case true:  println("true")
case false: println("false")
}
// error: switch must be exhaustive, consider adding a default clause

enum,但是,编译器很乐意只能看两种情况:

enum MyBool {
    case True
    case False
}

var b = MyBool.True
switch b {
case .True:  println("true")
case .False: println("false")
}

如果default出于编译器的需要而需要包含一个块,但没有任何要做,则可以使用该break关键字:

var b = true
switch b {
case true:  println("true")
case false: println("false")
default: break
}
2020-07-07