Swift开发第四篇——柯里化

Posted 淡泊宁静_JP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift开发第四篇——柯里化相关的知识,希望对你有一定的参考价值。

本篇分为两部分:

一、柯里化的基本使用

二、柯里化的使用场景

 


 

一、柯里化的基本使用

柯里化(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()
    }
}

 

以上是关于Swift开发第四篇——柯里化的主要内容,如果未能解决你的问题,请参考以下文章

第四十四篇iOS开发中git添加.gitignore文件

深入理解DOM节点类型第四篇——文档片段节点DocumentFragment

Swift柯里化

Swift柯里化

Swift函数柯里化(Currying)简谈

第四篇 函数