当前位置: 首页 > 面试题库 >

Swift中开关盒的穷举状态

梁和颂
2023-03-14
问题内容

苹果文档说

每个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??的所有案例值。但是我仍然遇到错误?为什么会出现此错误,我错过了什么吗?


问题答案:

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
}


 类似资料:
  • 在Swift中,init(rawValue:)系统可确保将Int转换为enum会导致有效的enum case或nil。 Objective-C中没有这样的安全性,其中可以通过强制转换非成员“rawValue”来创建无效枚举成员。 打开枚举时,如果未处理枚举案例,编译器会警告您: 枚举值“third”未在开关中处理 但是,一旦处理完所有案例,就不会有类似的警告,表明对于枚举的无效成员仍然可能出现“默

  • 本文向大家介绍dart 开关盒,包括了dart 开关盒的使用技巧和注意事项,需要的朋友参考一下 示例 Dart有一个可用于代替长if-else语句的开关盒: 您只能比较整数,字符串或编译时常量。被比较的对象必须是同一类的实例(而不是其任何子类型的实例),并且该类不得覆盖==。 Dart中switch的一个令人惊讶的方面是非空case子句必须以break结尾,或者更不常见的是continue,thr

  • 我使用返回元组的函数。但是当我试图运行这个函数时,它给了我一个例外:函数中的非穷尽模式。

  • 我必须使函数:: [((String, String), Int)]- 这就是我提出的功能: 输出应该是一个元组列表,其中的字符串与元组x1中的inputWord以及整数x2成对出现 问题是我得到了我认为不应该存在的非详尽模式。 我试图替换与 这使得非穷举模式在列表不为空时消失,但也阻止了函数遍历元组的最后一个元组。

  • 是否有注释或其他方法可以将非穷举的 switch 语句警告转换为错误?我希望某个方法或类在开关中未正确处理所有值,则会产生错误。 示例: 在代码中的其他地方,该枚举上有一个开关,如下所示 Java会给您一个警告,该开关不会处理所有枚举值。我想把这个警告变成一个错误(永久性的,不管个别IDE设置如何)。 请记住,在这种情况下,我无法更改原始,因此我希望编译器强制执行它。

  • 我试图编写函数尾部,它将字符串转换成字符串列表,方式如下: 以下是我的实现: 正如标题所暗示的,这个函数中有一些非详尽的模式。不幸的是,我不明白为什么。 我是哈斯克尔的新手。。。任何帮助都将不胜感激!