2015-11-28 18 views
7

sto facendo questo problema impostare "FizzBuzz", e la mia istruzione switch mi sta dando qualche problema, qui è il mio codice:Swift 2: pattern di espressione di tipo 'Bool' non può corrispondere valori di tipo 'int'

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

Se potessi fornirmi puntatori/suggerimenti, invece di darmi il codice corretto, sarebbe perfetto: D Preferirei risolverlo da solo, ma alcuni suggerimenti potrebbero tirarmi fuori da questo buco.

+3

In aumento perché "non limitarmi a darmi il codice" è rinfrescante, grazie per quello. – Moritz

+2

Primo suggerimento: clausola 'where' – vadian

+1

Altro suggerimento: forse vuoi che il tuo metodo restituisca la stringa per ogni caso invece di stamparli e restituire n ... sperimentare con questo. Quindi è possibile utilizzare il risultato del metodo per stampare, invece di stampare nel metodo. – Moritz

risposta

9

Provate ad usare "caso lasciate dove":

func fizzBuzz(n: Int) -> String { 
    let result: String 
    switch n { 
    case let n where n % 3 == 0 && n % 5 == 0: 
     result = "FizzBuzz" 
    case let n where n % 3 == 0: 
     result = "Fizz" 
    case let n where n % 5 == 0: 
     result = "Buzz" 
    default: 
     result = "none" 
    } 
    print("n:", n, "result:", result) 
    return result 
} 
+1

Avevo una situazione simile in cui volevo fare qualcosa di diverso in base al tipo di elemento (generico) di una matrice e questa era l'unica cosa che funzionava per me. Grazie! – SilentDirge

8

Solo due cose sbagliate:

(1) I vostri casi sono espressioni booleane, così si vuole confrontare loro contro true, non n;

(2) È necessario un caso predefinito. Quindi:

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

Questo è interessante, 'commuta vero' piuttosto che' cambia n' per aggirare il brutto/inutile piatto necessario altrimenti: 'caso n dove n% 3 == 0:'. – pkamb

1

So che è in ritardo per questa risposta. Sto aggiornando la risposta di @Leo Dabus con un altro approccio che è scritto e testato su Xcode 7.3.1 e 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)" 
} 

Grazie, Spero che questo ha aiutato.

0

Un po 'in ritardo, ma solo per aggiungere alle varie risposte. Credo che la soluzione elegante per utilizzare ora è questo:

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 può accendere tuple (struct SortA, ma costruito al volo, senza una definizione da qualche altra parte nel codice). Quindi nel caso delle etichette è possibile verificare più valori contemporaneamente, che è l'ideale per FizzBuzz!

Per rompere il basso un po ', questa parte

(n%3==0, n%5==0) 

genera una tupla con due valori booleani. Poi un'etichetta caso come questo

case (true, true) 
    print("FizzBuzz") 

controlla se entrambi i valori (essenzialmente n%3==0 e n%5==0) sono vere e stampe "FizzBuzz"

Facendo in questo modo rende molto facilmente espandibile. Puoi aggiungere una terza definizione all'argomento switch e un terzo vero/falso ai tuoi casi e il tuo FizzBuzz può diventare un FizzBuzzJazz. È inoltre possibile assegnare un nome i valori nella tupla se volete da etichette semplicemente aggiungendo come

switch (fizz: n%3==0, buzz: n%5==0, jazz: n%7==0) { 
case (fizz: true, buzz: false, jazz: true) 
    print("FizzJazz") 
} 

rendere il codice più leggibile in alcuni casi.

Problemi correlati