Cambiar statement en Swift

Estoy aprendiendo la syntax de Swift y me pregunto, ¿por qué el siguiente código no está funcionando como espero que sea:

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)") } } 

Quiero imprimir Fizz cada número de time es divisible por 3 (3, 6, 9, 12, etc.) e imprimir Buzz cada vez que es divisible por 5. ¿Qué pieza del rompecabezas falta?

Nota: Resolví usando lo siguiente:

 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)") } } 

Quiero saber cómo resolver esto usando Switch. Gracias.

Las reglas habituales para el juego de buzz de Fizz son replace cada múltiplo de 3 por "Fizz", cada múltiplo de 5 por "Buzz", y cada múltiplo de 3 y 5 por "Fizz Buzz".

Esto se puede hacer con una instrucción de cambio en la tupla (i % 3, i % 5) . Tenga en count que _ significa "cualquier valor":

 for i in 1 ... 100 { switch (i % 3, i % 5) { case (0, 0): print("Fizz Buzz") case (0, _): print("Fizz") case (_, 0): print("Buzz") default: print(i) } } 

Cambie las sentencias en los enlaces de valor de soporte Swift.
Esto le permite asignar un valor que coincide con una condición determinada (evaluada a través de la cláusula where ) a una variable temporal ( x y y aquí):

 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)") } } 

También puede usar el valor de temp asignado en el cuerpo del caso.

Actualizar:
Matt Gibson señala en los comentarios que puede omitir la asignación a una temp var si no va a usarlo en el cuerpo de la caja.
Entonces, una versión más concisa del código anterior sería:

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

Nota lateral: sus 2 muestras de código son ligeramente diferentes (el primero usa el range 0-100 como input, mientras que el segundo opera entre 1-100). Mi muestra se basa en su primer fragment de código.

El comportamiento estándar de la industria del switch puede generar errores similares a "Go to Fail" .

Básicamente, el código no siempre hace exactamente lo que parece que hará el código al leerlo, lo que lleva a que los auditores de código omitan los errores críticos.

Para contrarrestar eso, Apple ha decidido que las declaraciones de cambio no deberían funcionar igual en Swift que en el estándar de la industria. En particular:

  • Hay un descanso automático al final de cada caso. Es imposible que se ejecute más de una instrucción de caso.
  • Si teóricamente es posible que uno de los enunciados del caso se pierda, el código no se comstackrá en absoluto. En breve, una de las sentencias del caso siempre se ejecutará, sin importar el valor que se brinde. Si proporciona una enumeración, todo valor de enumeración debe manejarse. Si se agrega un nuevo valor a una enumeración existente, el código no se comstackrá hasta que se agreguen nuevas sentencias de caso. Si proporciona un integer de 32 bits, debe manejar cada valor posible de un int de 32 bits.

Así es como se puede hacer

 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) } 

Use este codigo Tu lógica es incorrecta. Su statement de cambio no encuentra que el caso acepte 1 y 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()