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

cedebl8k  于 2023-04-04  发布在  Swift
关注(0)|答案(4)|浏览(102)

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

nszi6y05

nszi6y051#

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

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
}
cnwbcb6i

cnwbcb6i2#

只有两件事错了:
(1)您的case是布尔表达式,因此您希望将它们与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)"
}
06odsfpq

06odsfpq3#

我知道这个答案有点晚了。我正在用另一种方法更新@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)"
}

谢谢,希望这有帮助。

42fyovps

42fyovps4#

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

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可以切换元组(排序为结构,但在代码中没有其他地方的定义)。然后在case标签中,您可以一次检查多个值,这对于FizzBuzz来说是理想的!
分解一下,这部分

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

生成一个有两个布尔值的元组。然后一个像这样的case标签

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

检查这两个值(基本上是n%3==0n%5==0)是否为true并打印“FizzBuzz”
这样做使它非常容易扩展。您可以向switch参数添加第三个定义,并向case添加第三个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")
}

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

相关问题