zoukankan      html  css  js  c++  java
  • 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()
        }
    }
  • 相关阅读:
    jquery中的 deferred之 deferred对象 (一)
    javascript函数嵌套时arguments的问题
    Jquery中的 Deferred分析
    Javascript面试题收集
    jquery中的callbacks之我见
    javascript正则表达式中 (?=exp)、(?<=exp)、(?!exp)
    javascript中正则表达式中的 match,exec,test,replace 之我理解
    删除域帐户/网络帐号密码 重新登录域服务器
    jQuery.extend 与 jQuery.fn.extend
    HttpMessageConvert
  • 原文地址:https://www.cnblogs.com/Jepson1218/p/5281106.html
Copyright © 2011-2022 走看看