在Swift中切换语句

Evg*_*ban 35 switch-statement ios swift

我正在学习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)")
    }  
}
Run Code Online (Sandbox Code Playgroud)

我想在每次数字被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)")
    }   
}
Run Code Online (Sandbox Code Playgroud)

我想知道如何使用Switch解决这个问题.谢谢.

Mar*_*n R 101

FizzBu​​zz游戏的通常规则 是用"Fizz"替换3的每个倍数,用"Buzz"取代5的每个倍数,用"FizzBu​​zz" 取代3 5的每个倍数.

这可以通过元组上的switch语句来完成(i % 3, i % 5).请注意,这_意味着"任何价值":

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 美丽的答案:)当你使用语言的特定好处来解决问题时. (5认同)
  • 对我来说,这看起来像是应该问的问题的正确答案:) (4认同)

Tho*_*ing 20

Swift中的switch语句支持值绑定.
这允许您将与特定条件匹配的值(通过where子句评估)分配给临时变量(x&yhere):

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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以在案例正文中使用指定的临时值.

更新:
Matt Gibson在评论中指出,如果您不打算在案例正文中使用它,则可以省略对temp var的赋值.
所以上面代码的更简洁版本将是:

for i in 1...100 {
    switch (i){
    case _ where i%3 == 0:
        println("Fizz")
    case _ where i%5 == 0:
        println("Buzz")
    default:
        println("\(i)")
    }
}
Run Code Online (Sandbox Code Playgroud)

附注:您的2个代码示例略有不同(第一个使用范围0-100作为输入,而第二个使用1-100).我的示例基于您的第一个代码段.

  • 你不需要"let x","let y",因为你没有真正使用这些值,你可以这样做,例如`case _ where i%3 == 0:` (2认同)

Sur*_*gch 14

对于那些来这里只是想知道如何switch在Swift中使用该语句的人来说,这是一个更普遍的答案.

一般用法

switch someValue {
case valueOne:
    // executable code
case valueTwo:
    // executable code
default:
    // executable code
}
Run Code Online (Sandbox Code Playgroud)

let someValue = "horse"

switch someValue {
case "horse":
    print("eats grass")
case "wolf":
    print("eats meat")
default:
    print("no match")
}
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 没有break必要声明.这是默认行为.迅捷switch案件不会"失败".如果您希望它们在下一种情况下落入代码,则必须明确使用该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
}
Run Code Online (Sandbox Code Playgroud)

您还可以匹配整个时间间隔.

let someValue = 4

switch someValue {
case 0..<10:
    // executable code
case 10...100:
    // executable code
default:
    // executable code
}
Run Code Online (Sandbox Code Playgroud)

你甚至可以使用元组.此示例改编自文档.

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
}
Run Code Online (Sandbox Code Playgroud)

价值绑定

有时您可能希望从switch值中创建临时常量或变量.您可以在case声明后立即执行此操作.在使用值绑定的任何地方,它将匹配任何值.这类似于_上面的元组示例中的使用.从文档中修改了以下两个示例.

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
}
Run Code Online (Sandbox Code Playgroud)

您可以使用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
}
Run Code Online (Sandbox Code Playgroud)

进一步研究

  • 这个答案是一个快速参考.请阅读完整文档了解更多信息.不难理解.