Swift中Switch语句返回String报错:缺失返回值问题求助
解决Swift中"Missing return in a function expected to return 'String'"的问题
嘿,我帮你揪出问题啦!你遇到的这个编译错误,核心原因是你的代码没有覆盖所有可能的执行分支,Swift编译器对返回值的检查非常严格,必须确保每一条路径都能返回指定类型的值。
先看你代码里的明显问题:
- 在
case .paper的内部switch里,你只写了case .roc...——这明显是case .rock没写完,后续的.paper、.scissors分支都没处理; - 外层的switch直接漏掉了
case .scissors的整个分支,编译器完全不知道当玩家出.scissors时要返回什么。
哪怕你觉得“所有分支都设置了返回值”,但只要有一个枚举case没被覆盖,编译器就会判定存在无法返回值的路径,抛出错误。
给你优化后的完整代码(推荐写法)
其实不需要嵌套switch,Swift支持用元组同时匹配玩家和机器人的出拳,代码更简洁还不容易漏分支:
enum Sign { case rock, paper, scissors } func detectWinner(player: Sign, bot: Sign) -> String { switch (player, bot) { // 所有平局的情况 case (.rock, .rock), (.paper, .paper), (.scissors, .scissors): return "You Tied" // 所有玩家获胜的情况 case (.rock, .scissors), (.paper, .rock), (.scissors, .paper): return "You Won" // 剩下的所有情况都是玩家输 default: return "You Lost" } }
如果你不想用default,也可以把所有输的情况列出来:
这种写法会让编译器自动验证是否覆盖了所有可能的组合,完全不会再出现返回值缺失的错误:
func detectWinner(player: Sign, bot: Sign) -> String { switch (player, bot) { case (.rock, .rock), (.paper, .paper), (.scissors, .scissors): return "You Tied" case (.rock, .scissors), (.paper, .rock), (.scissors, .paper): return "You Won" case (.rock, .paper), (.paper, .scissors), (.scissors, .rock): return "You Lost" } }
再回头看你的原写法(如果坚持嵌套switch)
要是你想保留嵌套switch的结构,必须把所有分支都补全,比如:
func detectWinner(player: Sign, bot: Sign) -> String{ switch player{ case .rock: switch bot{ case .rock: return "You Tied" case .paper: return "You Lost" case .scissors: return "You Won" } case .paper: switch bot{ case .rock: return "You Won" case .paper: return "You Tied" case .scissors: return "You Lost" } case .scissors: switch bot{ case .rock: return "You Lost" case .paper: return "You Won" case .scissors: return "You Tied" } } }
这样每个嵌套switch都覆盖了bot的所有case,外层switch也覆盖了player的所有case,编译器就不会再报错啦。
内容的提问来源于stack exchange,提问作者randomnessthatsfunny
相关产品推荐
相关产品推荐

