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

Swift 2: expression pattern of type 'Bool' cannot match values of type 'Int'

我正在做这个问题集 "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 我宁愿自己解决它,但一些提示可以让我摆脱困境。

您可以使用 case let where 并在单独检查之前检查两者是否匹配:

func fizzBuzz(n: Int) -> String {
    let result: String
    switch n {
    case let n where n.isMultiple(of: 3) && n.isMultiple(of: 5):
        result = "FizzBuzz"
    case let n where n.isMultiple(of: 3):
        result = "Fizz"
            case let n where n.isMultiple(of: 5):
        result = "Buzz"
    default:
        result = "none"
    }
    print("n:", n, "result:", result)
    return result
}

只有两处错误:

(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)"
}

我知道这个答案有点晚了。我正在用另一种方法更新@Leo Dabus 的答案,该方法是在 Xcode 7.3.1 和 Swift 2.2.

上编写和测试的
func fizzBuzz(n: Int) -> String {
 switch n {
  case _ where n % 3 == 0:
    print("Fizz")
  case _ where n % 5 == 0:
    print("Buzz")
  case _ where n % 15 == 0:
    print("FizzBuzz")
  default:
    print("none")
 }
 return "\(n)"
}

谢谢,希望对您有所帮助。

有点晚了,只是为了补充各种答案。我相信现在使用的优雅解决方案是:

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 可以打开元组(类似结构,但在代码中其他地方没有定义的情况下动态构建)。然后在案例标签中,您可以一次检查多个值,这非常适合 FizzBu​​zz!

要分解一下,这部分

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

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

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

检查这两个值(本质上是 n%3==0n%5==0)是否为真并打印 "FizzBuzz"

这样做很容易扩展。您可以向 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")
}

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