函数中的嵌入式开关,如何检索 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
也可以比字符串比较更有效。
在您的代码中,您只是不需要 switch
的 default:
部分,因为这是回退情况,如果没有编码错误,则不可能。因此,删除该子句并将 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"
}
}
我是 '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
也可以比字符串比较更有效。
在您的代码中,您只是不需要 switch
的 default:
部分,因为这是回退情况,如果没有编码错误,则不可能。因此,删除该子句并将 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"
}
}