Swift 2: шаблон выражения типа "Bool" не может соответствовать значениям типа "Int"

Я делаю этот набор задач "FizzBuzz", и мой оператор switch вызывает у меня некоторые проблемы, вот мой код:

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

Если бы вы могли предоставить мне указатели / подсказки, вместо того, чтобы дать мне правильный код, это было бы здорово:D Я бы предпочел решить это сам, но несколько подсказок могут вытащить меня из этой дыры.

4 ответа

Решение

Попробуйте использовать "case let where":

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) Ваши случаи являются логическими выражениями, поэтому вы хотите сравнить их с trueне n;

(2) Вам нужен случай по умолчанию. Так:

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

Я знаю, что уже немного поздно для этого ответа. Я обновляю ответ @Leo Dabus другим подходом, который написан и протестирован на Xcode 7.3.1 и 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)"
}

Спасибо, надеюсь, это помогло.

Немного поздно, но просто чтобы добавить к различным ответам. Я считаю, что элегантное решение для использования сейчас заключается в следующем:

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 может включать кортежи (что-то вроде структуры, но построено на лету без определения где-то еще в коде). Затем в метках кейсов вы можете проверять сразу несколько значений, что идеально подходит для FizzBuzz!

Чтобы сломать это немного, эта часть

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

генерирует кортеж с двумя логическими значениями. Тогда такой ярлык

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

проверяет, оба ли значения (по существу, n%3==0 а также n%5==0) Верны и принты "FizzBuzz"

Делая это так, это делает его очень легко расширяемым. Вы можете добавить третье определение к аргументу switch и третье true/false для ваших дел, и ваш FizzBuzz может стать FizzBuzzJazz. Вы также можете назвать значения в кортеже, если хотите, просто добавив метки, такие как

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

делая код более читабельным в некоторых случаях.

Другие вопросы по тегам