加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift函数柯里化(Currying)简谈

发布时间:2020-12-14 07:07:17 所属栏目:百科 来源:网络整理
导读:大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化简单的说就是把接收多个参数的函数划分为若干个”嵌套”的单一参数的函数. 这样说谁也听

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处.
如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读