本篇分為兩部分: 一、柯里化的基本使用 柯里化(Currying):也就是把接受多個參數的方法變換成接受第一個參數的方法,並且返回接受餘下的參數並且返回結果的新方法。 然後通過只傳入第一個括弧內的參數進行調用,這樣將返回另一個方法 二、柯里化的使用場景 柯里化是一種量產相似方法的好辦法,可以通過柯里
本篇分為兩部分:
一、柯里化的基本使用
二、柯里化的使用場景
一、柯里化的基本使用
柯里化(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() } }