Swift函数柯里化(Currying)简谈
来源:互联网 发布:淘宝网店运费怎么设置 编辑:程序博客网 时间:2024/05/16 05:06
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)
下面简单说说Swift语言中的函数柯里化.简单的说就是把接收多个参数的函数划分为若干个”嵌套”的单一参数的函数.
这样说谁也听不懂,我们结合一个例子给大家简单说说.
我们需要定义一个函数A,该函数返回一个函数B,函数B创建一只大蜘蛛.为什么要间接返回大蜘蛛,因为本猫最怕大蜘蛛,所以不敢直接返回大蜘蛛 ;)
首先是蜘蛛的类:
class Spider:CustomStringConvertible { let name:String let leg:Int var description:String{ return "蜘蛛(\(name) leg:\(leg))" } init(name:String,leg:Int){ self.name = name self.leg = leg }}
因为我们不希望直接创建大蜘蛛,所以需要一个返回函数的函数:
func createSpawnSpiderFunc(name:String)->()->Spider{ func spwanSpider()->Spider{ return Spider(name: name, leg: 8) } return spwanSpider}let x = createSpawnSpiderFunc("BigSpider")let spider = x() //蜘蛛(BigSpider leg:8)
貌似还不错,但是上述方法把蜘蛛的腿限制在8只,这可不太好,所以我们做些调整:
func createSpawnSpiderFunc2(name:String)->(Int)->Spider{ func spwanSpider(leg:Int)->Spider{ return Spider(name: name, leg: leg) } return spwanSpider}let y = createSpawnSpiderFunc2("XLegSpider")let spiderXLeg = y(16) //蜘蛛(XLegSpider leg:16)
我们可以适当简化一下函数:
func createSpawnSpiderFunc3(name:String)->(Int)->Spider{ return {leg in return Spider(name: name, leg: leg) }}
你会说这个函数不算漂亮,因为后面拖着两个->尾巴,的确!这样不仅不优雅而且容易把新手绕晕,于是我们把函数摇身一变:柯里化思密达:
func createSpawnSpiderFuncCurry(name:String)(leg:Int)->Spider{ return Spider(name: name, leg: leg)}
我们这样调用:
let 蜘蛛 = createSpawnSpiderFuncCurry("大蜘蛛")(leg: 121) //蜘蛛(大蜘蛛 leg:121)
注意,以上函数的写法貌似返回类型是Spider,其实不然!它仍然返回一个函数!证明给你看:
let 创建超级大蜘蛛 = createSpawnSpiderFuncCurry("超级大蜘蛛")let 超级大蜘蛛 = 创建超级大蜘蛛(leg: 100000) //蜘蛛(超级大蜘蛛 leg:100000)
0 0
- Swift函数柯里化(Currying)简谈
- Swift 柯里化(Currying)
- Currying-柯里化[Swift笔记]
- Swift柯里化(Currying)
- Swift柯里化(Currying)
- Swift 柯里化(Currying)
- Swift柯里化(Currying)
- 浅谈 Swift 柯里化(Currying)
- 函数柯里化(Currying)
- Scala 函数柯里化(Currying)
- 函数柯里化function currying
- Swift 柯里化(currying)和反柯里化(uncurrying)
- Scala 函数柯里化(Function currying)
- 函数-JavaScript 中的 函数 currying 柯里化
- 前端开发者进阶之函数柯里化Currying
- 前端开发者进阶之函数柯里化Currying
- 函数式编程概念:柯里化(currying)
- 一道题看透函数柯里化(currying)
- UVA 11990``Dynamic'' Inversion(树套树)
- Java连接Redis
- 输入adb shell 时 提示error: more than one device and emulator
- ssm框架搭建三---mybatis打印sql
- AndroidStudio 集成海康威视 Android SDK,即集成萤石Android SDK。
- Swift函数柯里化(Currying)简谈
- [动态树 LCT] BZOJ 2157 旅游
- JBOSS安装配置并搭建本地开发环境
- 求最长回文子串,O(n)复杂度
- Android编程学习笔记 之 SQLite数据存储
- AVL树
- Linux下virtualbox 升级后1908错误,sudo: /etc/init.d/vboxdrv:找不到命令
- 会做题的兔兔——重大4月月赛
- C++ vector::resize