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")
}
делая код более читабельным в некоторых случаях.