Switch
swift 的 switch 不需要写break,只要匹配了一个case就直接退出执行后面的了。如果想让它继续执行后面的,可以在语句后加上fallthrough
。
⚠️加上它之后,编译器不会检查case的条件是否匹配,就直接执行下一个的case了,如果下一个case也有fallthrough
那就不去检查继续执行下一个case。
Labeled Statements
在swift中,可以在loop 和 conditional 中插入其他的loop 和 conditional,这些都可以使用break、continue等。有时候特别希望能够明确地说明这些break影响哪个loop 、continue。
label name: where condition {
statements
}
gameLoop: while square != finalSquare {
diceRoll += 1
if diceRoll == 7 { diceRoll = 1 }
switch square + diceRoll {
case finalSquare:
break gameLoop
case let newSquare where newSquare > finalSquare:
continue gameLoop
default:
square += diceRoll
square += board[square]
}
}
Early Exit
guard
类似 if
,代码的执行依赖于表达式的布尔值。我们可以使用guard
来要求表达式的值必须为true,来执行后面的代码。与if不同的是,guard
总是有else条件。
func greet(person: [String: String]) {
guard let name = person["name"] else {
return
}
print("Hello \(name)!")
guard let location = person["location"] else {
print("I hope the weather is nice near you.")
return
}
print("I hope the weather is nice in \(location).")
}
当然,else block里不仅可以使return,也可以是 break、throw、调用一个方法等。
使用guard
能够提高代码的可读性,相比使用if
。
Functions
函数类型包括参数类型和返回值类型,例如:(Int, Int) -> Int
。
函数定义&调用:
func greet(person: String) -> String {
let greeting = "Hello, " + person + "!"
return greeting
}
print(greet(person: "Anna"))
Function Argument Labels and Parameter Names
参数标签在调用函数的时候, 参数名字在函数内部使用。通常使用参数名字作为它的参数标签,比如下面的函数第一个参数。
func greet(person: String, from hometown: String) -> String {
return "Hello \(person)! Glad you could visit from \(hometown)."
}
可以省略参数标签:
func someFunction(_ firstParameterName: Int, secondParameterName: Int) {
// In the function body, firstParameterName and secondParameterName
// refer to the argument values for the first and second parameters.
}
someFunction(1, secondParameterName: 2)
swift的函数也可以给参数设置默认值,有默认值的参数要写在没有默认值参数后面。
func someFunction(parameterWithoutDefault: Int, parameterWithDefault: Int = 12) {
// If you omit the second argument when calling this function, then
// the value of parameterWithDefault is 12 inside the function body.
}
someFunction(parameterWithoutDefault: 3, parameterWithDefault: 6) // parameterWithDefault is 6
someFunction(parameterWithoutDefault: 4) // parameterWithDefault is 12
Variadic Parameters
可变参数在函数内部的使用方式同数组。
func arithmeticMean(_ numbers: Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)
In-Out Parameters
函数参数默认是常量。在函数内改变参数的值会得到一个编译期的错误。如果你想在函数内改变参数的值,并且让这些改变持续到函数调用后,可以使用 in-out 参数,在参数类型前使用inout
关键字。调用函数时,传给in-out类型的参数只能是var变量,不能是常量和字面量,因为它两是不可变的。
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)