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 可以打开元组(类似结构,但在代码中其他地方没有定义的情况下动态构建)。然后在案例标签中,您可以一次检查多个值,这非常适合 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")
}
在某些情况下使代码更具可读性。
我正在做这个问题集 "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 可以打开元组(类似结构,但在代码中其他地方没有定义的情况下动态构建)。然后在案例标签中,您可以一次检查多个值,这非常适合 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")
}
在某些情况下使代码更具可读性。