丢掉的柯里化,斯威夫特实例方法的真相

// 柯里化 

柯里化在维基百科的表明是把接受五个参数函数转变来接受3个单纯参数(最初函数的首先个参数)的函数,并且重回接受余下的参数而且回去结果的新函数的技能。

Swift中的实例方法

在Swift中,实例方法就是类措施以实例为参数并回到3个能够被实例调用的方法。能够说斯维夫特的实例方法其实是柯里化方法(并不完全等同,
可是思考是同1的)。

首先什么是柯里化函数呢?
实际很简短,就是将二个多参数的函数转变到1个函数调用链,调用链上的函数唯有2个参数。

下边举三个事例,四个参数相加:

func add(_ num1: Int, _ num2 :Int) -> Int{
    return num1 + num2
}

add函数的项目为:(Int, Int) -> Int.

柯里化:

func addCurried(_ num1: Int) -> (Int) -> Int {
    return { num2 in
        num1 + num2
    }
}

addCurried函数的档次为:(Int) -> (Int) -> Int

此地我们就将七个参数的函数柯里化成了多个单纯参数的函数。

调用addCurried(10)(20),结果1律add(10, 20)。


大意掌握了怎么是柯里化未来,大家言归正传来看看在Swift中实例方法是何等被调用的。

大家创造三个Person类:

class Person {
    var name: String

    init(name: String) {
        self.name = name
    }

    func welcome(to name: String) -> String {
        return "Hi, \(name). Nice to meet you!"
    }
}

然后新建三个实例对象,并调用实例方法welcome(to:) -> String

let person = Person(name: "Bob")
person.welcome(to: "Hebe")
//Hi, Hebe. Nice to meet you!

为啥我们说实例方法在Swift中精神上是类措施呢?
既是是类格局那我们应该就足以用类来调用,试试

澳门葡京备用网址 1

1.png

阴差阳错是应有的,类格局确实不能够直接调用实例方法,既然不能够一贯调用,咱们来看望那个函数总能够吧,要不然注脚实例方法是类形式吗。

澳门葡京备用网址 2

2.png

丢掉的柯里化,斯威夫特实例方法的真相。留意看右侧的种类,和大家事先说的1模一样,实例方法正是类措施以实例为参数并赶回3个足以被实例调用的措施

那我们就足以这么来调用:

澳门葡京备用网址 3

3.png

成了!

转自初稿链接

斯威夫特 里能够将艺术开始展览柯里化
(Currying),那是约等于把接受八个参数的章程开始展览部分变形,使其进一步灵活的措施。函数式的编制程序观念贯穿于
Swift 中,而函数的柯里化正是那门语言函数式特点的主要性表现。

举个例证,上面的函数轻便地将输入的数字加 1:

func addOne(num: Int) -> Int {

return num + 1

}

以此函数所公布的剧情相当轻易,假如大家随后还亟需三个将输入数字加
贰,恐怕加 3 的函数,大概只好类似地去定义重返为num + 贰恐怕num +
3的本子。有未有更通用的法子吧?大家实际上能够定义三个通用的函数,它将接受需求与输入数字相加的数,并回到二个函数。重返的函数将收受输入数字自个儿,然后实行操作:

func addTo (adder: Int)  ->  Int  -> Int   {

       return  {

              num  in

              return  num  + adder

      }

}

有了addTo,大家将来就能自由写出像是addOne大概addTwo那样的函数了

澳门葡京备用网址 4

再举一个例证,大家能够成立三个比较大小的函数:

澳门葡京备用网址 5

柯里化是壹种量产相似方法的好法子,能够由此柯里化3个办法模板来幸免写出累累再度代码,也便宜了之后保卫安全。

举一个事实上行使时候的事例,在Selector壹节中,大家关系了在
Swift中Selector只好利用字符串在转换。那面临一个十分的惨重的标题,便是难以重构,并且不也许在编写翻译时期开始展览检查,其实那是可怜危急的一言一动。不过target-action 又是 Cocoa
中那样首要的一种设计方式,无论如何大家都想安全地运用的话,应该怎么做呢?1种大概的消除办法正是选择格局的柯里化。OleBegemann
在那篇帖子里关系了壹种很好封装,那为大家如何借助柯里化,安全地改换和行使
target-action 提供了过多思路。

澳门葡京备用网址 6

//                              
斯维夫特 二.0 柯里化方法 (舍弃)

下边来比喻来探望柯里化和一般方法有啥差别:

//                      
斯威夫特 叁.0 柯里化常用方法推荐

拿七个数相乘来看

//  
函数式编程

一般方法

如此那般定义:

func multiple (a first: Int,b second:Int) -> Int { return first * second}

用法:

let result = multiple(a : 10, b : 10)

但万一本身希望一遍只输入3个值又该怎么做吧?那里就供给选择柯里化了。

/*

柯里化

定义:

func multiple(a first: Int)(b second:Int) -> Int{ return first * second}

用法:

let putFirst = multiplelet result = putFirst

下边大家打字与印刷一下结出看看那调用的三个点子再次回到的终究是何等:

澳门葡京备用网址 7EF212A48-8952-441B-847A-8FE8BBA0221D.png

由上海体育场地能够见到 let putFirst = multiple重回的依然是1个Int
->Int类型,熟习函数的能够看出那是传进三个Int类型值再次来到多少个Int类型值的函数,所以说柯里化其实正是经受1个函数类型的重回值。于是其实方法还足以写成这么的一种样式:

func multiple(a first:Int) -> (Int -> Int) { return { second in return first * second }}

从此间就能够清晰的看看重回值是 二个(Int ->
Int)类型函数。调用方法和下面那种办法一样,另1种调用方法能够如此写:

let abc = multiple

 Curried function declaration syntax func foo(x: Int)(y: Int) is of
limited usefulness and creates a lot of language and implementation
complexity. We should remove it.

将函数柯里化

澳门葡京备用网址 ,该方法如下:

func currying (method : ->Int) -> (Int -> (Int -> Int)){ return { first in { second in return method(first,second) } }}

我们从打字与印刷的结果来分析

澳门葡京备用网址 8B5B0CF60-4006-4F4F-8819-F79A8335628E.png

先是第1步是将原函数字传送进来,此时反回的是一个Int->(Int->Int)类型的函数,紧接着第一步我们传入叁个Int值重临的便是3个(Int->Int)类型的函数。于是大家再盛传第贰个Int值,那时就会反回最终的结果。

 

Implementing Target-Action in Swift

在喵神的博客里观看柯里化的多个用处,正是将要在Swift中贯彻Target-Action,奥莱Begemann 在博客中写的很领悟,作者就一向贴出代码。定义:

protocol TargetAction { func performAction()}struct TargetActionWrapper<T: AnyObject> : TargetAction { weak var target: T? let action:  -> () -> () func performAction() -> () { if let t = target { action } }} enum ControlEvent { case TouchUpInside case ValueChanged // ...} class Control { var actions = [ControlEvent: TargetAction]() func setTarget<T: AnyObject>(target: T, action:  -> () -> (), controlEvent: ControlEvent) { actions[controlEvent] = TargetActionWrapper(target: target, action: action) } func removeTargetForControlEvent(controlEvent: ControlEvent) { actions[controlEvent] = nil } func performActionForControlEvent(controlEvent: ControlEvent) { actions[controlEvent]?.performAction() }}

用法:

class MyViewController { let button = Control() func viewDidLoad() { button.setTarget(self, action: MyViewController.onButtonTap, controlEvent: .TouchUpInside) } func onButtonTap() { println("Button was tapped") }}

那样就贯彻了Target-Action方式。那就是本身对柯里化的局地主导掌握。刚伊始学Swift,如若有荒唐的地点谢谢建议,欢迎多多沟通。

 (函数的 currying
天性的使用情状并非常小,但他会扩张繁多语言的纷纷,所以须要删除它)

 */

 

 1 class Currying
 2 
 3 {
 4 
 5     // uncurried:普通函数
 6 
 7     // 接收多个参数的函数(与类相关的函数,统称为方法,但是这里就直接说函数了,方便理解)
 8 
 9     func add(a: Int, b: Int, c: Int) -> Int{
10 
11         print("\(a) + \(b) + \(c)")
12 
13         return a + b + c
14 
15     }
16 
17     
18 
19     // curried:柯里化函数 --> 本质函数式编程思想
20 
21     func addCur(_ a: Int) -> (Int) -> (Int) -> Int{
22 
23         return {
24 
25             b in
26 
27             return {
28 
29                 c in
30 
31                     a + b + c
32 
33             }
34 
35         
36 
37         }
38 
39     }
40 
41 }
42 
43  
44 
45 let curry = Currying()
46 
47 var number = Currying.addCur(curry)(12)(23)(12)
48 
49 print(number)
50 
51  
52 
53 // NO.2
54 
55 let datePrint:(Int)->(Int)->(String)->Void =
56 
57 {
58 
59     month in
60 
61     print("\(month)月")
62 
63     return{
64 
65         day in
66 
67         print("\(day)日")
68 
69         return{
70 
71             action in
72 
73             print("\(action)")
74 
75         }
76 
77     }
78 
79 }
80 
81 let actionPrint = datePrint(2016)(11)
82 
83 actionPrint("写详细")
84 
85  

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website