本篇分为两部分:
一、柯里化的基本使用
二、柯里化的使用场景
一、柯里化的基本使用
柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果的新方法。
func addTwoNumbers(a: Int)(num: Int) -> Int { return a + num }
然后通过只传入第一个括号内的参数进行调用,这样将返回另一个方法
let addToFour = addTwoNumbers(4) let result = addToFour(num: 6) func greaterThan(comparor: Int)(input: Int) -> Bool { return input > comparor; } let greaterThan10 = greaterThan(10) greaterThan10(input: 13) greaterThan10(input: 9)
二、柯里化的使用场景
柯里化是一种量产相似方法的好办法,可以通过柯里化一个方法模板来避免写出很多重复的代码,方便日后维护。但在 Swift 中 Selector 只能使用字符串生成,这样将难以重构,并且如果拼写错误很容易出错。但是 target-action 又是 Cocoa 中很重要的一种设计模式,我们可以利用柯里化对他进行改造达到更安全使用的目的。
protocol TargetAction { func performAction() } struct TargetActionWrapper<T: AnyObject>: TargetAction { weak var target: T? let action: (T) -> () -> () func performAction() -> () { if let t = target { action(t)() } } } enum ControlEvent { case TouchUpInsede case ValueChanged } class Control { var actions = [ControlEvent: TargetAction]() func setTarget<T: AnyObject>(target: T, action: (T) -> () -> (), controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper (target: target, action: action) } func removeTargetForControlEvent(controlEvent: ControlEvent) { actions[controlEvent] = nil } func performActionForControlEvent(controlEvent: ControlEvent) { actions[controlEvent]?.performAction() } }