Swift Currying(柯里化)
標簽(空格分隔): swift
- 函數(shù)式編程思想
先舉一個小例子:
func addOne(count: Int) -> Int {
return count + 1
}
//上面這個代碼我們是返回一個加和,和是使參數(shù)增加1傍药;
//一個更加靈活的方法,我們可以取消上面的硬編碼1余素;
func add(count: Int, addition: Int) -> Int {
return count + addition
}
//然而這個函數(shù)還并不是那么友好畏纲,我們用另外一種方法實現(xiàn)看一下:
func add(_ addition: Int) -> (Int) -> Int {
return {
count in
return count + addition
}
}
//調(diào)用一下以上方法,看看有什么區(qū)別:
let number = add(count: 10, addition: 2) //函數(shù)2
let add2 = add(2) //函數(shù)3
let number = add2(10)
let number = add(2)(10) //函數(shù)3調(diào)用連起來是
//是不是覺得這種調(diào)用方式很熟悉迈窟,有點類似于
//classname.property.subproperty,點語法鏈
顯然這種編程方式更加靈活忌栅,所展現(xiàn)的內(nèi)容更加直觀车酣,可以減少函數(shù)寫N多的參數(shù);當然函數(shù)式編程有的可不只是這些,更多內(nèi)容不在本篇所討論之內(nèi)湖员;
基于上例我們來寫一個方法:
func greaterThan(_ comparer: Int) -> (Int) -> Bool {
return { $0 > comparer }
}
let compareResult = greaterThan(10)(11)
很明顯下面這個式子的調(diào)用直觀的表達了參數(shù)10和參數(shù)11的大衅肚摹;
- target-action例子
我們來看國外網(wǎng)上的一個例子:
protocol TargetAction {
func performAction()
}
struct TargetActionWrapper<T: AnyObject>: TargetAction {
weak var target: T?
let action: (T) -> () -> (Void)
func performAction() -> (Void) {
if let t = target {
action(t)()
}
}
}
//
enum ControlEvent {
case TouchUpInside
case ValueChanged
// ...
}
class Control {
var actions = [ControlEvent: TargetAction]()
convenience init<T: AnyObject>(_ target: T, action: @escaping (T) -> () -> (Void), controlEvent: ControlEvent) {
actions[controlEvent] = TargetActionWrapper(
target: target, action: action)
}
func setTarget<T: AnyObject>(target: T, action: @escaping (T) -> () -> (Void), controlEvent: ControlEvent) {
actions[controlEvent] = TargetActionWrapper(target: target, action: action)
}
func removeTargetForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent] = nil
}
func performActionForControlEvent(controlEvent: ControlEvent) {
actions[controlEvent]?.performAction()
}
}
//我們來使用一下我們的模板
func viewDidLoad() {
Control().setTarget(self, action: ViewController.tapAction, controlEvent: .touchUpInside)
}
}
func tapAction() {
print("單擊了")
}
//如果我們不是用實例方法調(diào)用而是自定義構(gòu)造函數(shù)的話
//我們能看到更好的表現(xiàn)方式
func viewDidLoad() {
Control.init(self, action: ViewController.tapAction controlEvent: .touchUpInside)
}
//當然這個便利構(gòu)造函數(shù)的例子用在這里并不是很合邏輯破衔,但是我們只是想展現(xiàn)一下柯里化的內(nèi)容