Swift 无法确定 switch 子句是不是详尽

Posted

技术标签:

【中文标题】Swift 无法确定 switch 子句是不是详尽【英文标题】:Swift cannot determine switch clauses being exhaustiveSwift 无法确定 switch 子句是否详尽 【发布时间】:2014-07-05 22:17:41 【问题描述】:

这是一个人为的问题,因为我想更详细地了解 swift。 快速编译器抱怨以下内容并不详尽。当然,在一般情况下,它无法确定案例陈述是否详尽无遗。我应该怎么做最好 告诉编译器我的列表是详尽无遗的,例如以下情况?

let point = (2, 2) 

switch point     
    case let (x, y) where x == y:
        println("on the x=y line")
    case let (x, y) where x != y:
        println("somewhere else off x=y line") 

是添加空默认值的唯一选项吗?

【问题讨论】:

【参考方案1】:

是添加空默认值的唯一选项吗?

在这一点上,是的。这是我们目前必须解决的编译器错误。如果我是你,我肯定会file a Radar 详细说明你的发现。

【讨论】:

它可能最终不会成为永远修复的“编译器错误”。通过运算符重载,可以创建==!= 都不会为相同的两个操作数返回true 的类型。 我已按照建议提交了雷达;见 17568787。 Apple 已报告错误 17568787。它已关闭,因为要解决它需要约束求解器,但这会对编译时间产生不利影响。【参考方案2】:

我正在研究 Swift,我找到了以下解决方案来解决您的简短 sn-p:

let point = (2, 2)

switch point 
case let (x, y) where x == y:
    print("on the x=y line")
case let (x, y): // Otherwise where x != y:
    print("somewhere else off x=y line")

我知道,这不是编译器进行的穷举检查的解决方案,但它是避免无用的default 子句的一种方法。

【讨论】:

以上是关于Swift 无法确定 switch 子句是不是详尽的主要内容,如果未能解决你的问题,请参考以下文章

Swift中开关盒的详尽条件

枚举的详尽 switch 语句的静态分析 [重复]

Switch 语句必须详尽 - Xcode 错误?

Xcode 12 中的 Switch 必须详尽无遗

switch 在递归类型中必须是详尽的

下划线符号是不是会忽略或检查 Swift 中 switch 语句中的无效性?