Language Guide --- 那些非通用的

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)

你可能感兴趣的:(Language Guide --- 那些非通用的)