【Swift】 函数与闭包(一)

394 阅读2分钟

定义和调用函数

定义函数如下:

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}

调用函数

greet(person: "DDD")
  • 可以使用元组返回多值
  • 也可以使用可选类型返回值

形式参数

  • 每一个函数形式参数都包含参数标签和参数名。
    • 参数标签用在调用函数的时候
    • 参数名用在函数的实现当中
    • 默认情况下,参数名作为参数标签
    • 可以使用_省略函数标签
  • 可变形式参数
    • 可以接受多个或者零个特地类型的值。
    • 形式参数的类型名称后面插入三个点符号...来书写形式参数
    • 传入到可变参数中的值在函数主体中被当作是对应类型的数组
func arthmeticMean(_ numbers: Double...) -> Double {
    val total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}

arthmeticMean(1, 2, 3, 4, 5)
  • 在形式参数定义开始的时候在前面添加一个inout关键字可以定义一个输入输出形式参数。
func swap(_ a: inout Int, _ b: inout Int){
    let tm = a
    a = b
    b = tm
}
var some = 3
var another = 108
swap(&some, &another) // some = 108; another = 3
  • 每一个函数都有一个特定的函数类型,它由形式参数类型,返回类型组成
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b: Int ) {
    print(\(mathFuntion(a, b)))
}

闭包

  • 闭包表达式是一种在简短行内就能写完闭包的语法
{(parameters) -> (return type) in
 	statements 
}


//example

let names = [...]
var reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
                                     			return s1 > s2
                                     })
  • 从语境中推断类型
    • 排序闭包为实际参数来传递给函数,故Swift能推断它的形式参数和返回类型
var reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
  • 从单表达式闭包隐式返回
    • 单表达式闭包能够通过从它们的声明中删掉return关键字来隐式返回它们耽搁表达式的结果
var reversedNames = names.sorted(by: { s1, s2 in  s1 > s2 } )
  • 简写实际参数名
var reversedNames = names.sorted(by: { $0 > $1 } )
  • 尾随闭包
    • 如果你需要将一个很长的闭包表达式作为函数最后一个实际参数传递给函数,使用尾随闭包将增加函数的可读性。
    • 尾随闭包是一额被书写在函数形式参数的括号外面的闭包表达式
var reversedNames = names.sorted{ $0 > $1 }