Swift闭包函数(Array)

2016-03-16  本文已影响207人  Mi欧阳

闭包概述:(以下是我拷贝的)

闭包(Closures)

问题:对names中的元素按字母升序排序 (Z最小,A最大)

var names = ["Swift", "Arial", "Soga", "Donary"]

函数写法

func backwards(s1: String, s2: String) -> Bool {
    return s1 > s2 // 升序排序
}

var reversed = names.sort(backwards)

把上面的普通函数写法转换为闭包函数

reversed = names.sort({
    (s1: String, s2: String) -> Bool in
    return s1 > s2
})

sort是一个排序函数,它通过基于输出类型排序的闭包函数,给已知类型的数组数据的值排序。需要一个闭包参数作为参数:Sort函数的完整抽象形态如下:

    names.sort { (String1, String2) -> Bool in
        do someting
        return Bool
    }

sort也是一个尾随闭包函数(Trailing Closures)
如果函数需要一个闭包参数作为参数,且这个参数是最后一个参数,而这个闭包表达式又很长时,可以使用尾随闭包。尾随闭包可以放在函数参数列表外,也就是括号外。
如果尾随闭包函数只有一个参数,那么可以把括号()省略掉,后面直接跟着闭包。

尾随闭包去掉括号

reversed = names.sort{
    (s1: String, s2: String) -> Bool in
    return s1 > s2
}

由于参数传入时swift会进行隐式类型推导,省去参数类型

reversed = names.sort{
    (s1,s2) -> Bool in
    return s1 > s2
}

同理由于结果return时swift会进行隐式类型推导,省去返回值类型

reversed = names.sort{
    (s1,s2) in
    return s1 > s2
}

既然类型都没了,闭包里面自带了一套默认的参数名,你可以不声明闭包参数列表。
第一参数:$0,第二参数:$1 ...
这是后闭包函数声明中的参数列表和返回值类型都没了
那么关键字in也省了吧,直接写内部结构体

reversed = names.sort{
    return $0 > $1
}

如果内部结构体中只有return这么一句话,return也能省

reversed = names.sort{$0 > $1}

最简单的写法,只留下操作符,注意,这时候尾闭包使用的是()
这种方法只适用于闭包中只有"默认参数名"和"运算符"这两者的情况

reversed = names.sort(>)

闭包的运用:捕获值(内嵌函数捕获外部函数中定义的常量和变量)

func increment(amount amount: Int) -> (() -> Int) {
    var total = 0
    func incrementAmount() -> Int {
        total += amount // total是外部函数体内的变量,这里是可以捕获到的
        return total
    }
    return incrementAmount // 返回的是一个嵌套函数(闭包)
}

// 闭包是引用类型,所以incrementByTen声明为常量也可以修改total
let incrementByTen = increment(amount: 10)
incrementByTen() // return 10,incrementByTen是一个闭包
incrementByTen() // return 20
incrementByTen() // return 30

let incrementByOne = increment(amount: 1)
incrementByOne() // return 1
incrementByOne() // return 2
incrementByOne() // return 3

//函数本身不占内存,使用赋值后才占.
//所以多次调用同一个函数不会对其他调用该函数的变量造成影响
//incrementByTen和incrementByOne不会应为他们都使用increment而相互影响
incrementByTen() // return 40
incrementByOne() // return 4
上一篇下一篇

猜你喜欢

热点阅读