博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift Currying(柯里化)
阅读量:6261 次
发布时间:2019-06-22

本文共 2315 字,大约阅读时间需要 7 分钟。

Swift Currying(柯里化)

标签(空格分隔): swift


  1. 函数式编程思想 先举一个小例子:
func addOne(count: Int) -> Int {    return count + 1}//上面这个代码我们是返回一个加和,和是使参数增加1;//一个更加灵活的方法,我们可以取消上面的硬编码1;func add(count: Int, addition: Int) -> Int {    return count + addition}//然而这个函数还并不是那么友好,我们用另外一种方法实现看一下:func add(_ addition: Int) -> (Int) -> Int {    return {        count in         return count + addition    }}//调用一下以上方法,看看有什么区别:let number = add(count: 10, addition: 2)    //函数2let add2 = add(2)           //函数3let number = add2(10)let number = add(2)(10)     //函数3调用连起来是//是不是觉得这种调用方式很熟悉,有点类似于//classname.property.subproperty,点语法链复制代码

显然这种编程方式更加灵活,所展现的内容更加直观,可以减少函数写N多的参数;当然函数式编程有的可不只是这些,更多内容不在本篇所讨论之内;

基于上例我们来写一个方法:

func greaterThan(_ comparer: Int) -> (Int) -> Bool {    return { $0 > comparer }}let compareResult = greaterThan(10)(11)复制代码

很明显下面这个式子的调用直观的表达了参数10和参数11的大小;

  1. target-action例子

我们来看国外网上的一个例子:

protocol TargetAction {    func performAction()}struct TargetActionWrapper
: 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
(_ target: T, action: @escaping (T) -> () -> (Void), controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper( target: target, action: action) } func setTarget
(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("单击了")}//如果我们不是用实例方法调用而是自定义构造函数的话//我们能看到更好的表现方式func viewDidLoad() { Control.init(self, action: ViewController.tapAction controlEvent: .touchUpInside)}//当然这个便利构造函数的例子用在这里并不是很合逻辑,但是我们只是想展现一下柯里化的内容复制代码

转载地址:http://znesa.baihongyu.com/

你可能感兴趣的文章
无线时代来临,谁来管理我的无线AP?
查看>>
Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析(5)...
查看>>
《从零开始学Swift》学习笔记(Day 49)——扩展声明
查看>>
NeHe OpenGL第二十七课:影子
查看>>
免费有理之文件备份软件
查看>>
JavaSE6基于JSR105的XML签名之理论篇
查看>>
hadoop命令——hdfs
查看>>
cocos2d-x自制工具04:AnimatePacker for Mac/Win32 v2.0 Build1发布!
查看>>
ORA 12592的报错处理及补丁更新
查看>>
修改活动目录服务器的IP地址及域名注意
查看>>
C#发送电子邮件
查看>>
xslt中的for-each排序
查看>>
在SQL Server2005中进行错误捕捉
查看>>
Net操作配置文件(Web.config|App.config)通用类
查看>>
文本编辑器实例
查看>>
EntityFramework之一对一关系(二)
查看>>
我心中的核心组件(可插拔的AOP)~调度组件quartz.net续~任务管理器的开发(CronTrigger强大功能)...
查看>>
Html2Text
查看>>
spring boot + mybatis实现一对一,一对多的样码之一种
查看>>
Android OpenGL ES 应用(二) 纹理
查看>>