Swift 函数作为参数的写法

本文主要介绍 Swift 中函数作为参数传递的几种写法.

Swift 作为一种强类型语言,其语法却有非常灵活的写法. 类似于 JavaScrip 等现代语言,Swift 也具备闭包(closure)的机制,并且函数作为一种数据类型,可以很方便的作为参数传递给目标函数.

下面举一个例子对于这种情况的几种写法做一下记录.

函数 hasAnyMatches 接受两个参数,第一个接受一个整型数组,第二个接受一个函数,检查数组中的元素,若有任意一个元素通过参数 2 函数的检查,则返回 true,否则返回 false.

1
2
3
4
5
6
7
8
func hasAnyMatches(list: [Int], condition: (Int)->Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}

我们写一个函数用以检查数组中是否有小于 10 的数,有以下几种写法

  1. 有名函数作为参数传递

    1
    2
    3
    4
    5
    func lessThanTen(number: Int) -> Bool {
    number < 10 // 单行代码可省略 return,认为返回该行的值
    }

    hasAnyMatches(list: numbers, condition: lessThanTen)

  2. 内敛匿名函数作为参数

    使用 {} 包裹匿名函数,并使用 in 分隔返回类型和函数题:

    1
    2
    3
    hasAnyMatches(list: numbers, condition: {(number: Int) -> Bool in
    number < 10
    })

  3. 内联写法的省略形式

    当函数作为最后一个参数时,可以将匿名函数拿到调用函数的小括号外:

    1
    2
    3
    hasAnyMatches(list: numbers) {(number: Int) -> Bool in
    number < 10
    }

  4. 内敛写法的进一步省略

    Swift 虽为强类型语言,单当类型可以被推断时,则可省略关于类型的声明:

    1
    2
    3
    hasAnyMatches(list: numbers) {number in
    return number < 10
    }

参考

A Swift Tour