在Swift中切换语句

时间:2014-08-13 05:57:25

标签: ios swift switch-statement

我正在学习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解决这个问题。谢谢。

7 个答案:

答案 0 :(得分:98)

FizzBuzz game的通常规则 是用#34; Fizz&#34;取代3的每个倍数,每5的倍数由&#34; Buzz&#34;和 3&lt; strong>和 5的每一个倍数由&#34; FizzBu​​zz&#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
}

进一步研究

  • 这个答案是一个快速参考。请阅读完整的documentation了解更多信息。这并不难理解。

答案 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中切换语句不应该与行业标准相同。特别是:

  • 每个案例结束时都会自动中断。执行多个案例陈述是不可能的。
  • 如果理论上可能错过其中一个case语句,那么代码根本不会编译。在swift中,无论提供什么值,都会始终执行其中一个case语句。如果提供枚举,则必须处理每个枚举值。如果将新值添加到现有枚举,则在添加新的case语句之前,代码将不会编译。如果提供32位整数,则必须处理32位int的每个可能值。

答案 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()