2022-05-30

Swift: 函数式和柯里化


比如我们要实现一个+1的功能,我们可以这样写

1
2
3
func addOne(num: Int) -> Int {
return num + 1
}

坏处就在于这个函数不能复用,如果是一些需要常用的方法,可以柯里化出一个函数模板

1
2
3
4
5
func adder(_ adder: Int) -> (Int) -> Int {
return { num in
return num + adder
}
}

addTwo是一个(Int) -> Int类型的闭包,吃一个Int类型,所以就是返回6 + 2
我们可以对这个闭包进行复用

1
2
3
let addTwo = adder(2)
let result = addTwo(6)
print(result) // 8

另外一个柯里化的例子

1
2
3
4
5
6
func greaterThan(_ comparer: Int) -> (Int) -> Bool {
return { $0 > comparer }
}
let greaterThan10 = greaterThan(10);
greaterThan10(13) // => true
greaterThan10(9) // => false

关于逃逸闭包(暂时就先写在这篇吧)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import UIKit

func doWork(block: ()->()) {
block()
}

func doWorkAsync(block: @escaping ()->()) {
DispatchQueue.main.async {
block()
}
}

class Test {
var foo = "a"
func method1() {
doWork {
print(foo)

}
foo = "b"
}

func method2() {
doWorkAsync {
print(self.foo)
}
foo = "b"
}

func method3() {
doWorkAsync { [weak self] in
print(self?.foo ?? "nil")
}
foo = "b"
}
}
Test().method1() // a
Test().method2() // b
Test().method3() // nil