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
FizzBuzz游戏的通常规则 是用"Fizz"替换3的每个倍数,用"Buzz"取代5的每个倍数,用"FizzBuzz" 取代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)
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).我的示例基于您的第一个代码段.
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)