Swift 2:x27型表达模式;布尔';无法匹配类型为';Int';
我正在做这个题集“FizzBuzz”,我的switch语句给了我一些问题,下面是我的代码:Swift 2:x27型表达模式;布尔';无法匹配类型为';Int';,swift,switch-statement,fizzbuzz,Swift,Switch Statement,Fizzbuzz,我正在做这个题集“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)" } 如果你能给我提供指针/提示
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可以切换元组(sorta结构,但在代码的其他地方没有定义的情况下动态构造)。然后,在案例标签中,您可以一次检查多个值,这是FizzBuzz的理想选择
把它分解一下,这部分
(n%3==0, n%5==0)
生成具有两个布尔值的元组。然后是这样的箱子标签
case (true, true)
print("FizzBuzz")
检查这两个值(基本上是n%3==0
和n%5==0
)是否为真,并打印“嘶嘶嘶嘶”
这样做使它很容易扩展。您可以在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")
}
使代码在某些情况下更具可读性。第一个提示:
where
clauseOther提示:可能您希望您的方法返回每种情况下的字符串,而不是仅打印它们并返回n。。。用这个做实验。然后您可以使用该方法的结果来打印,而不是在该方法中打印。相关:(但不幸的是,它包含完整的解决方案:)另一个提示:案例是按照从上到下的顺序进行评估的,因此请考虑您想要“嘶嘶嘶嘶”的位置我有一个类似的情况,我想根据数组的(通用)元素类型做一些不同的事情,这是唯一对我有效的事情。非常感谢。这很有趣,switch-true
而不是switch-n
来绕开丑陋/无用的样板文件,否则需要:case-let-n,其中n%3==0:
。