Swift Currying(柯里化)

Swift Currying(柯里化),第1张

概述Swift Currying(柯里化) 标签(空格分隔): swift 函数式编程思想 先举一个小例子: func addOne(count: Int) -> Int { return count + 1} //上面这个代码我们是返回一个加和,和是使参数增加1; //一个更加灵活的方法,我们可以取消上面的硬编码1;func add(count: Int, addition: Int) Swift Currying(柯里化)

标签(空格分隔): swift

函数式编程思想
先举一个小例子:
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的大小;

target-action例子

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

protocol TargetAction {    func performAction()}struct TargetActionWrapper<T: AnyObject>: 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<T: AnyObject>(_ target: T,action: @escaPing (T) -> () -> (VoID),controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper( target: target,action: action) } func setTarget<T: AnyObject>(target: T,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) } //当然这个便利构造函数的例子用在这里并不是很合逻辑,但是我们只是想展现一下柯里化的内容
总结

以上是内存溢出为你收集整理的Swift Currying(柯里化)全部内容,希望文章能够帮你解决Swift Currying(柯里化)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1056028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存