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
原创粉丝点击