swift 柯里化(示例通知事件)

来源:互联网 发布:java集合有几种 编辑:程序博客网 时间:2024/05/16 05:13

        柯里化 :一个方法有几个参数只传递第一个参数,返回的将是一个方法

        举个例子加强理解,网络请求的时候,是不是有一个固定的URL前缀,每一个接口后面拼接的URL都会不同,柯里化就很酷的解决这个问题

       这是在全局文件定义的代码,注意下面这个方法,在传入第一个参数的,方法体的代码并不会执行,而是返回一个方法(这个方法有一个形参mutableURL,一个返回值:完整的url字符串

func spliceRequestURL(fixURLHead:String)(mutableURL:String)->String{

    return fixURLHead.stringByAppendingString(mutableURL)

}


/// swift没有宏概念,用全局方法代替宏就可以了

let GetFullRequestURL =spliceRequestURL("http://www.baidu.com/")

下面看看怎么使用:

完整的使用代码是这样:

 let requestURL =GetFullRequestURL(mutableURL:"userCenter/Myinfo/ModifyName")

 print(requestURL)

最后打印出来 http://www.baidu.com/userCenter/Myinfo/ModifyName 这个地址

基本思想就是这样,运用各有不同,自定义通知 代码,以供参考

//

//  currying.swift

//  TestRAC

//

//  Created by 道法自然 on 16/7/5.

//  Copyright © 2016 xiaying. All rights reserved.

//


import UIKit


/// 目标事件协议

protocol TargetAction {

    func performAction()

}


/**

 OC中的委托

 事件包装结构,这里是泛型,这里表示传入的数据类型可以是AnyObject

 这个方法遵循TargetAction协议来处理事件

 */

struct TargetActionWrapper<T: AnyObject>:TargetAction{

    

    weak var target: T?

    let action: (T) -> () -> ()

    

    func performAction() -> () {

        iflet t =target {

            action(t)()

        }

    }

}


/// 枚举事件

enum ControlEvent {

    case TouchUpInside

    case ValueChanged

    //...

}


/// 例子

class currying{

    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()

    }

}





0 0