嵌入式开关功能,如何检索返回值?

时间:2015-05-31 11:59:34

标签: ios function swift switch-statement

我是'深入'OOP和iOS开发的新手,所以本周一直在弄脏它。我感觉更舒服所以决定创造一个摇滚,纸张,剪刀游戏。我知道它非常简单,对这个非常简单的陈述的任何批评都是受欢迎的。

为了比较用户和计算机选择,我创建了比较选择函数和嵌入的case语句。我得到的错误是函数没有收到任何返回的东西,大概是因为返回调用都在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'
}

这些返回的位置,switch语句是否有返回,我没有看到文档中提到的任何内容。如何更改此值,以便返回比较选择函数。 TIA。

3 个答案:

答案 0 :(得分:2)

使用enum代替字符串文字可以更好地为此服务。 enum可准确表示您允许的所有状态,并可防止您输入拼写错误。 enum也可以比字符串比较更有效。

在您的代码中,您不需要default:的{​​{1}}部分,因为这是后备情况,如果没有编码错误,则不应该这样做。因此,删除该子句并将switch移动到函数的最后一行。

答案 1 :(得分:2)

switch语句中的返回确实会保留该函数,但是您没有考虑所有可能的路径。如果您使用“Spock”​​调用您的函数作为计算机的选择,您将不会点击任何现有的返回语句。

如果您使用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"
    }
}

答案 2 :(得分:0)

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

char *str = "omgillsetyouonfire";
char **asdf = str_all_rotations(str);

for (int i = 0; i < strlen(str); i++) 
{
    free(asdf[i]);
}

free(asdf);

或者您只需返回一个对您有意义的字符串

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