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的写法犯了两个关键错误,其中第一个直接导致编译失败:
self.heads是非法的语法self是Coin类型的实例,而.heads是枚举的case值——你不能用self.heads来判断当前实例是不是.heads,这就像你拿着一只猫,问“这只猫是猫品种吗?”逻辑不通,语法上也完全不支持。
要判断枚举实例是否匹配某个case,正确的写法是用self == .heads(因为你的Coin枚举没有关联值,Swift会自动为它合成Equatable协议实现),或者用if case .heads = self这种模式匹配语法。三元运算符的类型不匹配
退一步说,就算你写对了判断条件,原代码的逻辑也依赖于第一个表达式返回Bool类型(三元运算符要求第一个参数必须是布尔值),但self.heads连合法表达式都算不上,更不可能返回Bool——这直接触发编译器的语法错误。
修正flip2的正确写法
如果想让flip2正常工作,只需要把判断条件改成合法的布尔表达式就行:
var flip2: Coin { return self == .heads ? .tails : .heads }
这种写法和flip1的逻辑完全一致,编译器也会正常通过。
内容的提问来源于stack exchange,提问作者Vince O'Sullivan
相关产品推荐
相关产品推荐

