Swift 4枚举元组模式匹配报错:是语言限制还是使用错误?
Swift 4枚举元组模式匹配报错问题解答
嘿,我一眼就发现问题所在了——这不是Swift 4模式匹配的限制,只是你犯了个小笔误而已!
先看你给出的代码:
enum Event { case scan case stopScanning } enum State { case idle case scanning } let tuple: (State, Event) = (State.idle, Event.scan) switch(tuple) { case (.idle, .scan): return State.scanning case (.scan, .stopScanning): return State.idle default: return state }
报错提示pattern cannot match values of type 'State',核心原因是你在第二个case里把State的枚举成员写错了:State枚举定义的是case scanning,但你在匹配元组第一个元素时写的是.scan——这个成员在State里根本不存在!.scan是Event枚举的成员,可元组第一个元素是State类型,编译器自然会提示这个模式匹配不上State类型的值。
修正后的代码只需要把第二个case里的.scan改成.scanning,另外注意你代码里的return state变量未定义,我们可以调整成返回元组里的当前状态,示例如下:
enum Event { case scan case stopScanning } enum State { case idle case scanning } func getNextState(from tuple: (State, Event)) -> State { switch tuple { case (.idle, .scan): return .scanning case (.scanning, .stopScanning): return .idle default: return tuple.0 } } // 测试调用 let testTuple: (State, Event) = (.idle, .scan) print(getNextState(from: testTuple)) // 输出 scanning
这样就能正常运行了,本质就是枚举成员名称的拼写错误,和Swift 4的模式匹配能力无关~
内容的提问来源于stack exchange,提问作者Peter Lamberg
相关产品推荐
相关产品推荐

