函数中的嵌入式开关,如何检索 return 值?

Embedded switch in function, how do i retrieve the return value?

我是 'in depth' OOP 和 iOS 开发的新手,所以这周我一直在亲自动手。我感觉更舒服了,所以决定制作一款剪刀石头布游戏。我知道它非常简单,欢迎对这个非常简单的声明提出任何批评。

为了比较用户和计算机选择,我创建了嵌入了 case 语句的比较选择功能。我得到的错误是函数没有接收到 return 的任何内容,大概是因为 return 调用都在 switch 语句中。

func comparePicks(var human: String, var computer: String) -> String {
    switch human{
        //Player Chooses Rock
        case "Rock":
            if computer == "Rock"{
                return "Draw"}
            else if computer == "Paper"{
                return "Lose"}
            else if computer == "Scissors"{
                return "Win"}
            //Player Chooses Scissors
        case "Scissors":
            if computer == "Scissors"{
                return "Draw"}
            else if computer == "Rock"{
                return "Lose"}
            else if computer == "Paper"{
                return "Win"}
            //Player Chooses Paper
        case "Paper":
            if computer == "Paper"{
                return "Draw"}
            else if computer == "Rock"{
                return "Lose"}
            else if computer == "Scissors"{
                return "Win"}
        default:
            return "error"
    }
    // Error here - "Missing return in a function expected to return 'String'
}

这些在哪里也得到 returned,switch 语句可以有 returns,我没有看到文档中提到的任何内容。我该如何更改它,以便将 return 提供给比较 Picks 函数。 TIA.

为此使用 enum 而不是字符串文字会更好。 enum 准确表示所有允许的状态,并防止您输入错误。而且 enum 也可以比字符串比较更有效。

在您的代码中,您只是不需要 switchdefault: 部分,因为这是回退情况,如果没有编码错误,则不可能。因此,删除该子句并将 return "error" 移至函数的最后一行。

您的函数必须 return 一个字符串,Swift 编译器不确定这是否会一直发生。我喜欢在我的代码中有一个退出点(一个 return)就在最后,我使用一个变量来保持结果为 return,我相信它更容易理解,但是是我个人的选择。 适合您的解决方案: 您可以在 return 中添加一个问号,这样它就不必总是 return 某些东西而您最终 return nil

func comparePicks(var human: String, var computer: String) -> String?{
    //some code
    return nil
}

或者您可以 return 一个对您有意义的字符串

func comparePicks(var human: String, var computer: String) -> String {
        //some code
        return "No Result"
}

你的 switch 语句中的 returns 确实离开了函数,但你没有考虑所有可能的路径。如果您使用计算机选择的 "Spock" 调用您的函数,您将不会命中任何现有的 return 语句。

如果您用 else 替换计算机的第三个比较,它有效:

func comparePicks(var human: String, var computer: String) -> String {
    switch human{
        //Player Chooses Rock
    case "Rock":
        if computer == "Rock"{
            return "Draw"}
        else if computer == "Paper"{
            return "Lose"}
        else {
            return "Win"}

        //Player Chooses Scissors
    case "Scissors":
        if computer == "Scissors"{
            return "Draw"}
        else if computer == "Rock"{
            return "Lose"}
        else {
            return "Win"}

        //Player Chooses Paper
    case "Paper":
        if computer == "Paper"{
            return "Draw"}
        else if computer == "Rock"{
            return "Lose"}
        else {
            return "Win"}

    default:
        return "error"
    }

    // No error, all cases accounted for.
}

因此,如果涵盖了所有路径,则不需要额外的 return 语句。正如@MartinR 在评论中指出的那样,这隐藏了错误,因为 "Spock" 现在可能是一个获胜状态,而它实际上应该是一个错误。

正如其他答案所暗示的那样,枚举将是一种更好的方法,因为这样您就可以通过为枚举设置 3 个有效值来避免这种可能的错误情况。


这是一个使用枚举的解决方案,只是因为我玩得很开心...

enum Choices: String, Printable {
    case Rock = "Rock"
    case Paper = "Paper"
    case Scissors = "Scissors"

    var description: String {
        return self.rawValue
    }

    static func random() -> Choices {
        return [.Rock, .Paper, .Scissors][Int(arc4random_uniform(3))]
    }
}

func comparePicks(human: Choices, computer: Choices) -> String {
    switch human {

    //Player Chooses Rock
    case .Rock:
        switch computer {
        case .Rock:     return "Draw"
        case .Paper:    return "Lose"
        case .Scissors: return "Win"
        }

    //Player Chooses Scissors
    case .Scissors:
        switch computer {
        case .Scissors: return "Draw"
        case .Rock:     return "Lose"
        case .Paper:    return "Win"
        }

    //Player Chooses Paper
    case .Paper:
        switch computer {
        case .Paper:    return "Draw"
        case .Scissors: return "Lose"
        case .Rock:     return "Win"
        }
    }
}

let human = Choices.random()
println(human)  // prints "Paper"
let computer = Choices.random()
println(computer)  // Prints "Rock"
println(comparePicks(human, computer))  // Prints "Win"

通过创建一个选择元组,您可以将比较组合到一个 switch 语句中:

func comparePicks(human: Choices, computer: Choices) -> String {
    switch (human, computer) {
    case (.Rock, .Rock), (.Scissors, .Scissors), (.Paper, .Paper): return "Draw"
    case (.Rock, .Scissors), (.Scissors, .Paper), (.Paper, .Rock): return "Win"
    case (.Rock, .Paper), (.Paper, .Scissors), (.Scissors, .Rock): return "Lose"
    }
}