Swift 2:'Bool'类型的表达式模式不能匹配'Int'类型的值

时间:2015-11-28 19:32:59

标签: swift switch-statement fizzbuzz

我正在做这个问题集“FizzBu​​zz”,我的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 我宁愿自己解决这个问题,但是一些提示可以让我脱离这个洞。

4 个答案:

答案 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结构,但是在代码中的其他地方没有定义的情况下构建)。然后在案例标签中,您可以一次检查多个值,这是FizzBu​​zz的理想选择!

稍微分解一下,这部分

(n%3==0, n%5==0)

生成一个包含两个布尔值的元组。然后像这样的案例标签

case (true, true)
    print("FizzBuzz")

检查这两个值(实际上是n%3==0n%5==0)是否为真并打印" FizzBu​​zz"

这样做可以很容易地扩展。您可以为switch参数添加第三个定义,为您的案例添加第三个true / false,并且您的FizzBu​​zz可以成为FizzBu​​zzJazz。如果需要,您也可以通过简单地添加像

这样的标签来命名元组中的值
switch (fizz: n%3==0, buzz: n%5==0, jazz: n%7==0) {
case (fizz: true, buzz: false, jazz: true)
    print("FizzJazz")
}

在某些情况下使代码更具可读性。