You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Switch语句 vs 三元运算符:为何示例代码中flip1可编译而flip2不行?

为什么flip1可正常编译,flip2却不行?

先看你给出的代码片段:

enum Coin {
    case heads
    case tails
    
    var flip1: Coin {
        switch self {
        case .heads: return .tails
        case .tails: return .heads
        }
    }
    
    var flip2: Coin {
        return self.heads ? .tails : .heads
    }
}

先说说flip1能正常编译的原因

flip1用了Swift处理枚举的标准姿势:通过switch语句匹配当前实例(self)的所有可能case。

  • 当self是.heads时,返回.tails;
  • 当self是.tails时,返回.heads;
    因为Coin只有这两个case,switch完全覆盖了所有可能性,编译器没有理由挑毛病,自然能正常通过。

再看flip2编译失败的核心问题

flip2的写法犯了两个关键错误,其中第一个直接导致编译失败:

  1. self.heads是非法的语法
    self是Coin类型的实例,而.heads是枚举的case值——你不能用self.heads来判断当前实例是不是.heads,这就像你拿着一只猫,问“这只猫是猫品种吗?”逻辑不通,语法上也完全不支持。
    要判断枚举实例是否匹配某个case,正确的写法是用self == .heads(因为你的Coin枚举没有关联值,Swift会自动为它合成Equatable协议实现),或者用if case .heads = self这种模式匹配语法。

  2. 三元运算符的类型不匹配
    退一步说,就算你写对了判断条件,原代码的逻辑也依赖于第一个表达式返回Bool类型(三元运算符要求第一个参数必须是布尔值),但self.heads连合法表达式都算不上,更不可能返回Bool——这直接触发编译器的语法错误。

修正flip2的正确写法

如果想让flip2正常工作,只需要把判断条件改成合法的布尔表达式就行:

var flip2: Coin {
    return self == .heads ? .tails : .heads
}

这种写法和flip1的逻辑完全一致,编译器也会正常通过。

内容的提问来源于stack exchange,提问作者Vince O'Sullivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:44:45