我正在做这个问题集“FizzBuzz”,我的switch语句给了我一些问题,这是我的代码:
func fizzBuzz(n: Int) -> String {
switch n {
case n % 3 == 0: print("Fizz")
case n % 5 == 0: print("Buzz")
case n % 15 == 0:print("FizzBuzz")
}
return "\(n)"
}
如果你能提供指针/提示,而不是给我正确的代码,那就会膨胀:D 我宁愿自己解决这个问题,但是一些提示可以让我脱离这个洞。
答案 0 :(得分:10)
尝试使用“case let where”:
interface
答案 1 :(得分:10)
只有两件事:
(1)您的案例是布尔表达式,因此您希望将它们与true
进行比较,而不是n
;
(2)您需要一个默认案例。所以:
func fizzBuzz(n: Int) -> String {
switch true {
case n % 3 == 0: print("Fizz")
case n % 5 == 0: print("Buzz")
case n % 15 == 0: print("FizzBuzz")
default: print("Shoot")
}
return "\(n)"
}
答案 2 :(得分:1)
我知道这个答案迟到了。我正在使用另一种方法更新@Leo Dabus的答案,该方法是在Xcode 7.3.1和Swift 2.2上编写和测试的。
'lokuki48(malac)'.
谢谢,希望这有帮助。
答案 3 :(得分:0)
有点晚了,但只是为了添加各种答案。我相信现在使用的优雅解决方案是:
func fizzBuzz(n: Int) {
switch (n%3==0, n%5==0) {
case (true, false):
print("Fizz")
case (false, true):
print("Buzz")
case (true, true):
print("FizzBuzz")
default:
print(n)
}
}
Swift可以打开元组(sorta结构,但是在代码中的其他地方没有定义的情况下构建)。然后在案例标签中,您可以一次检查多个值,这是FizzBuzz的理想选择!
稍微分解一下,这部分
(n%3==0, n%5==0)
生成一个包含两个布尔值的元组。然后像这样的案例标签
case (true, true)
print("FizzBuzz")
检查这两个值(实际上是n%3==0
和n%5==0
)是否为真并打印" FizzBuzz"
这样做可以很容易地扩展。您可以为switch参数添加第三个定义,为您的案例添加第三个true / false,并且您的FizzBuzz可以成为FizzBuzzJazz。如果需要,您也可以通过简单地添加像
这样的标签来命名元组中的值switch (fizz: n%3==0, buzz: n%5==0, jazz: n%7==0) {
case (fizz: true, buzz: false, jazz: true)
print("FizzJazz")
}
在某些情况下使代码更具可读性。