我正在学习Swift的语法并且想知道为什么下面的代码没有像我期望的那样工作:
for i in 1...100{
switch (i){
case 1:
Int(i%3) == 0
println("Fizz")
case 2:
Int(i%5) == 0
println("Buzz")
default:
println("\(i)")
}
}
我希望每次数字被3(3,6,9,12等)整除时打印Fizz,并且每次可被5整除时打印Buzz。缺少什么拼图?
注意:我确实使用以下方法解决了这个问题:
for ( var i = 0; i < 101; i++){
if (Int(i%3) == 0){
println("Fizz")
} else if (Int(i%5) == 0){
println("Buzz")
} else {
println("\(i)")
}
}
我想知道如何使用Switch解决这个问题。谢谢。
答案 0 :(得分:98)
FizzBuzz game的通常规则 是用#34; Fizz&#34;取代3的每个倍数,每5的倍数由&#34; Buzz&#34;和 3&lt; strong>和 5的每一个倍数由&#34; FizzBuzz&#34;。
这可以通过元组(i % 3, i % 5)
上的switch语句来完成。
请注意,_
表示&#34;任何值&#34;:
for i in 1 ... 100 {
switch (i % 3, i % 5) {
case (0, 0):
print("FizzBuzz")
case (0, _):
print("Fizz")
case (_, 0):
print("Buzz")
default:
print(i)
}
}
答案 1 :(得分:19)
在Swift支持值绑定中切换语句
这允许您将与特定条件(通过where
子句评估)匹配的值分配给临时变量(x
&amp; y
此处):
for i in 1...100 {
switch (i){
case let x where x%3 == 0:
println("Fizz")
case let y where y%5 == 0:
println("Buzz")
default:
println("\(i)")
}
}
您还可以在案例正文中使用指定的临时值。
<强>更新强>
马特吉布森在评论中指出,如果你不打算在案件正文中使用它,你可以省略对临时变量的赋值。
所以上面代码的更简洁版本将是:
for i in 1...100 {
switch (i){
case _ where i%3 == 0:
println("Fizz")
case _ where i%5 == 0:
println("Buzz")
default:
println("\(i)")
}
}
旁注:您的2个代码示例略有不同(第一个使用范围0-100作为输入,而第二个使用1-100运行)。我的示例基于您的第一个代码段。
答案 2 :(得分:13)
对于那些来这里只是想知道如何在Swift中使用switch
语句的人来说,这是一个更通用的答案。
switch someValue {
case valueOne:
// executable code
case valueTwo:
// executable code
default:
// executable code
}
实施例
let someValue = "horse"
switch someValue {
case "horse":
print("eats grass")
case "wolf":
print("eats meat")
default:
print("no match")
}
备注:强>
break
声明。这是默认行为。斯威夫特switch
案件没有&#34;落后&#34;。如果您希望它们落入下一个案例中的代码,则必须明确使用fallthrough
关键字。break
语句。case
语句是不可行的,则最后可以包含default
语句以捕获任何其他值。 Swift switch
声明非常灵活。以下部分包括一些其他使用方法。
如果您使用逗号分隔值,则可以在单个案例中匹配多个值。这称为复合案例。
let someValue = "e"
switch someValue {
case "a", "b", "c":
// executable code
case "d", "e":
// executable code
default:
// executable code
}
您还可以匹配整个间隔。
let someValue = 4
switch someValue {
case 0..<10:
// executable code
case 10...100:
// executable code
default:
// executable code
}
您甚至可以使用元组。此示例改编自documentation。
let aPoint = (1, 1)
switch aPoint {
case (0, 0):
// only catches an exact match for first and second
case (_, 0):
// any first, exact second
case (-2...2, -2...2):
// range for first and second
default:
// catches anything else
}
有时您可能希望从switch
值创建临时常量或变量。您可以在case
语句后立即执行此操作。在使用值绑定的任何地方,它将匹配任何值。这类似于在上面的元组示例中使用_
。以下两个示例是从documentation修改的。
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
// can use x here
case (0, let y):
// can use y here
case let (x, y):
// can use x or y here, matches anything so no "default" case is necessary
}
您可以使用 where
关键字进一步优化匹配。
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
// executable code
case let (x, y) where x == -y:
// executable code
case let (x, y):
// executable code
}
答案 3 :(得分:2)
这就是它可以做到的方式
var i = 0
switch i {
case i where i % 5 == 0 && i % 3 == 0: print(" Fizz Buzz")
case i where i % 3 == 0 : print("Fizz")
case i where i % 5 == 0 : print("Buzz")
default: print(i)
}
答案 4 :(得分:1)
交换机的行业标准行为可能导致与"Go to Fail"类似的错误。
基本上,代码并不总是完全按照代码在阅读时所做的那样,这会导致代码审计员跳过关键错误。
为了解决这个问题,Apple决定在Swift中切换语句不应该与行业标准相同。特别是:
答案 5 :(得分:0)
这是我使用switch语句解决此类问题的两种方法。
1 >>使用where关键字
func printNumberType(number : Int){
switch number {
case number where number % 3 == 0 && number % 5 == 0 :
print("foo bar")
case number where number % 3 == 0 :
print("foo")
case number where number % 5 == 0 :
print("bar")
default :
print("Number is not divisible by 3 and 5")
}
}
2 >>使用值组合
func printNumberByMultipleValues(number : Int){
let combination = (number % 3,number % 5)
switch combination {
case (0,0):
print("foo bar")
case (0,_) :
print("foo")
case (_,0) :
print("bar")
default :
print("Number is not divisible by 3 and 5")
}
}
以下是更接近多值类型的示例。
var printNumberByMultipleValues : (Int)->() = { number in
let combination = (number % 3,number % 5)
switch combination {
case (0,0):
print("foo bar")
case (0,_) :
print("foo")
case (_,0) :
print("bar")
default :
print("Number is not divisible by 3 and 5")
}
}
答案 6 :(得分:-1)
使用此代码。你的逻辑错了。您的Switch语句未找到案例接受1和2
class TEST1{
func print() -> Void{
var i = 0
for i in 1...100{
if Int(i%3) == 0 {
println("Fizz")
}
else if Int(i%5) == 0{
println("Buzz")
}
else {
println("\(i)")
}
}
}
}
var x = TEST1()
x.print()