我是'深入'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。
答案 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
}