2017-09-10 71 views
1

我是编程新手,即将完成“Intro to App Development with Swift”iBook。我目前在第19课,枚举和交换机,并在相关的操场8页它显示下面的代码:枚举行为的理解(用Swift介绍应用程序开发 - 第19课)

enum LunchChoice { 
    case pasta, burger, soup 
} 

func cookLunch(_ choice: LunchChoice) -> String { 
    if choice == .pasta { 
     return "" 
    } else if choice == .burger { 
     return "" 
    } else if choice == .soup { 
     return "" 
    } 

    return "Erm... how did we get here?" 
} 

cookLunch(.soup) 

本身,这不是一个问题,我听不懂,但有一次我打电话cookLunch(.soup) ,最后的回报声明不显示。 演习略低于问我:

尝试改变传递给cookLunch值,以便在最终else语句被称为

而这正是我卡住了,因为它似乎不可能通过除了枚举中的选项以外,它与cookLunch函数不同。

你能帮助我理解这一切背后的意义,也许提供给我一个解决方案?

+0

如果您传入.soup的值,则会触发las子句。顺便说一句 - 更好的做法是使用switch语句而不是if语句。 – Abizern

+0

是的,这是本书解释交换机会更好的方式。但仍然,最后一个条款并没有出现... –

回答

1

你的指示说“使最终else语句被称为”。这将是汤回报,而不是“我们如何到达这里”的回报。正如你所说,有3个午餐选择和3个if/else语句,其中一个总是会被调用。你必须添加一个没有相应的第四午餐选择,否则如果为了“我们怎么到这里”代码执行。

+1

你的解释应该在他们的课程中。对于初学者来说,这是一件非常棘手的事情,必须弄清楚。 – Shades

+0

问题是:如果我取消最后一个“返回”语句(我们是如何到达的),整个函数会给我一个错误。这个练习已经提供了cookLunch.soup来调用'last'语句,但是告诉我改变一些东西以便调用最后一句。又怎样? –

+0

不可以。你永远不可能通过你发布的代码来获得“我们怎么到这里”。然而,编译器不够聪明。它认为可能会出现一个情况,即所有'if'情况下的执行都会落到最后。编译器坚持提供每个可能的“执行路径”的返回值,所以它会给你一个错误。 –

2

你有两个选择:

  • 注释掉第三比较

    // } else if choice == .soup { 
    //  return "" 
    
  • 添加未被覆盖的比较

    enum LunchChoice { 
        case pasta, burger, soup, steak 
    } 
    

    ,并通过它第四个案例:

    cookLunch(.steak) 
    

但是没有人会认真地写出这样的if - else链,在斯威夫特一个switch表达适当

func cookLunch(_ choice: LunchChoice) -> String { 
    switch choice { 
    case .pasta: return "" 
    case .burger: return "" 
    case .soup: return "" 

    default: return "Erm... how did we get here?" 
    } 
} 
+0

而好处然后来自不提供默认,这是一个检查,以确保您正在处理所有可能提供的值。 – Abizern

相关问题