【Swift】 函数与闭包(二)

1,695 阅读2分钟

闭包

func makeIncrement(amount: Int) -> () -> Int {
    var total = 0
    func increment() -> Int {
        total += amount
        return total
    }
    return increment
}

let incrementByTen = makeIncrement(amount: 10)
print(incrementByTen())
print(incrementByTen())
print(incrementByTen())
  • 逃逸闭包
    • 当闭包作为一个实际参数传递给一个函数的时候,并且它会在函数返回之后调用,我们就说这个闭包逃逸了。当你声明一个接受闭包作为形式参数的函数时,可以在形式参数写´@escaping´ 来明确闭包时允许逃逸的
    • 闭包可以逃逸的一种方法是被存储在定义于函数外的变量里。
  • 自动闭包
    • 自动闭包是一种自动创建的用来把作为实际参数传递给函数表达式的闭包。不接受任何参数,并且当它被调用时候,它会返回内部打包的表达式的值
    • 这个语法的好处是通过写普通表达式代替显示闭包而使你省略包围函数形式参数的括号
    • 自动闭包允许你延迟处理,其内部代码知道你调用它的时候才会运行
var names = ["zhangsan", "lisi", "wangwu", "zhangliu"]
let customerProvider = { names.remove(at: 0) }
print(names.count)
print(customerProvider()) //延迟处理
print(names.count)

var providers:[()->String] = []

func collectCustomProviders(provider: @autoclosure @escaping () -> String) {
    providers.append(provider)
}

collectCustomProviders(provider: names.remove(at: 0))
collectCustomProviders(provider: names.remove(at: 0))
print(names.count)

for p in providers {
    print(p())
    print(p())
}

print(names.count)

class SomeClass {
    var x: String = "hello"
    func doSomething() {
        collectCustomProviders(provider: self.x) //逃逸闭包需要使用self来引用
    }
}

高阶函数

  • map

    • 对于原始集合里的每一个元素,以一个变换后的元素替换之形成一个新的集合

    image.png

  • filter

    • 对于原始集合里的每个原始,通过判定来将其丢弃或者放进新的集合

image.png

  • reduce

    • 对于原始集合里的每一个元素,作用于当前累积的结果上

    image.png

  • flatmap

    • 对于元素是集合的集合,可以得到单级的集合
  • compactMap

    • 过滤控制
let numbers = [1, 2, 4, 5, 10]
print(numbers.map{ $0 * 10 })
print(numbers.filter{ $0 > 4 })
print(numbers.reduce(100) {$0 + $1})

let arrayNumbers = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(arrayNumbers.flatMap{ $0.map{ $0 * 10 }})

let names: [String?] = ["zhangsan", "lisi" , nil, "wangwu"]
print(names.count)
print(names.compactMap {$0} )
print(names.compactMap {$0?.count} )