函数

函数命名

Swift 的命名指南建议如果一个函数有多个参数形成单一的概念,那么介词应该放在函数的末尾。如果没有多个参数,介词应该以外部参数名的形式出现在圆括号内。

// 外部参数在括号内,使用介词
func printPersonalGreating(to name: String) {
    print(name)
}

// 介词在函数名尾部
// 除法运算
func divisonDescriptionFor(numerator: Double, denominator: Double) {
    ...
}

为函数和参数命名有时候很难,更像是艺术而不是科学。一般来说,我们建议给函数和参数起易读又能提供足够信息的名字。你应该还争取让代码符合日常说话的语法。最后,应该总是考虑函数名字是否容易输入。

变长参数

变长参数接受零个或更多输入值作为实参。函数只能有一个变长参数,而且一般应该是参数列表最后一个。参数值在函数内部以数组的形式可用。

func printPersonalGreetings(to names: String...) {
    for name in names { // names 类型是 [String]
        print("Hello \(name)")
    }
}

printPersonalGreetings(to: "Chirs", "Pat")
printPersonalGreetings() // 正常调用不会报错

默认参数值

Swift 的参数可以接受默认值。默认值应该放在函数参数列表的末尾。如果形参有默认值,那么在调用函数时可以有多个选择样, 可以省略实参。

func divisionDescriptionFor(numerator: Double, denominator: Double, withPunctuation punctucation: String = ".") {
    print("\(numerator) divied by \(denominator) equals \(numerator / denominator)\(punctucation)")
}

divisionDescriptionFor(numerator: 9, denominator: 6) // 可省略最后的参数
divisionDescriptionFor(numerator: 9, denominator: 6, withPunctuation: "!")

in-out 参数

出于于某种原因,函数有时候需要修改实参的值。in-out 参数能让函数影响函数体以外的变量。
注意点:

  • in-out 参数不能有默认值。
  • 变长参数不能标记为 in-out。
var error = "The request is failed"
func appendErrorCode(_ code: Int, toErrorString errorString: inout String) {
    if code == 400 {
        errorString += " bad request."
    }
}

appendErrorCode(400, toErrorString: &error)
error // The request is failed bad request.

函数调用时候传递给 in-out 参数变量需要在前面加上 &, 表示函数会修改这个变量 in-out 参数和函数返回值不同。如果你的目标是让函数有所产出,那么有更优雅的方式来实现。

嵌套函数和作用域

/// 三角形面积
///
/// - Parameters:
///   - base: 底边长
///   - height: 高度
/// - Returns: 面积
func areaOfTriangleWith(base: Double, height: Double) -> Double {
    let numerator = base * height
    func divide() -> Double {
        return numerator / 2
    }
    return divide()
}

areaOfTriangleWith(base: 3.0, height: 5.0)

常量 numerator 和函数 divide() 共享 areaOfTriangleWith(base:height:) 的 {} 闭合作用域,任何定义在函数作用域中的东西都对函数可见,所以 divide() 函数可以调用到 numerator,由于 divide() 在函数作用域内部,那么外部是不可见的。这样的好处能把功能相关的函数定义在内部,便于分离功能。

results matching ""

    No results matching ""