我们知道在ruby之类的动态语言中对象方法可以先从类中预先抽取,然后再应用到某个具体对象上.这称为无绑定的method对象,也可以叫做lazy绑定.

下面举个例子:

irb(main):004:0> system("ruby -v")
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15]
=> true
irb(main):005:0> class A
irb(main):006:1> def test(i)
irb(main):007:2> return i*i
irb(main):008:2> end
irb(main):009:1> end
=> nil

以上在ruby中创建了一个类A,我们可以用它的实例调用test方法:

a = A.new
a.test(11)    => 121

我们也可以先创建一个无绑定的method,然后绑定到特定的实例上去:

irb(main):021:0> f_no_bind = A.instance_method("test")
=> #<UnboundMethod: A#test>
irb(main):022:0> f = f_no_bind.bind(A.new)
=> #<Method: A#test>
irb(main):023:0> f.call(11)
=> 121
irb(main):024:0> f[11]
=> 121

最后一句是倒数第二句的语法糖,效果是一样的.

那么如果是类方法呢?那更简单了,直接用Obj.method()即可:

irb(main):025:0> class A
irb(main):026:1> def self.test(i)
irb(main):027:2> i*i*i
irb(main):028:2> end
irb(main):029:1> end

irb(main):037:0> f_class_func = A.method("test")
=> #<Method: A.test>
irb(main):038:0> f_class_func[11]
=> 1331
irb(main):039:0> f_class_func.call(11)
=> 1331

无论你承认与否,ruby比swift还要简洁,更具有美感!

现在回过头来看一下Swift中方法的lazy绑定又是什么样子的:

class Foo{
    func test(val:Int)->Int{
        return val * val
    }
}

let foo = Foo()
foo.test(val: 11)

let f = Foo.test
f(foo)(11)

如果你查看f的类型会发现它是一个柯里函数:

(Foo) -> (Int) -> Int

那么如果是类方法呢?给Foo类新增一个类方法:

class func test(val:Int)->Int{
        return val * val * val
    }

这时你会发现原来let f = Foo.test的结果变成了其类方法:

如果你想绑定其实例方法,你必须将其类型补全:

很好很强大,但还是没有ruby的简洁哦!

Swift中方法(method)所谓的lazy绑定简介的更多相关文章

  1. Swift中方法闭包参数不能省略括号的一种情况

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在swift中,如果方法的最后一个参数是一个闭包类型, ...

  2. SWift中 '?' must be followed by a call, member lookup, or subscript 错误解决方案

    那是因为你在使用自己写的分类时没有指定返回的数据类型  指定下返回数据类型就好了 我是用的oc写的分类在Swift中使用的 错误代码 private lazy var btn = UIButton.C ...

  3. go语言中的方法method

    package main; import "fmt" //重新定义一个类型 //为该INT类型扩展方法 type INT int; type A struct { name str ...

  4. 在 Swift 中实现单例方法

    我们通常在进行开发的时候,会用到一个叫做 单例模式 的东西.相信大家也都对这种模式非常熟悉了.而且单例的使用在平时的开发中也非常频繁. 比如我们常用到的 NSUserDefaults.standard ...

  5. 在Swift中实现单例方法

    在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...

  6. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  7. 在Swift中使用JavaScript的方法和技巧

    本文作者Nate Cook是一位独立的Web及移动应用开发者,是继Mattt大神之后NSHipster的主要维护者,也是非常知名活跃的Swift博主,并且还是支持自动生成Swift在线文档的Swift ...

  8. Swift中对C语言接口缓存的使用以及数组、字符串转为指针类型的方法

    由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与Unsafe ...

  9. 2.C#中泛型在方法Method上的实现

    阅读目录   一:C#中泛型在方法Method上的实现 把Persion类型序列化为XML格式的字符串,把Book类型序列化为XML格式的字符串,但是只写一份代码,而不是public static s ...

随机推荐

  1. 手动导入xmpp后,再使用cocoapods的时候出现的问题

    最新的cocoapod导入xmpp的时候,会出现循环依赖,所以撸主选择了手动导入. 一开始还用的挺开心的,后来,使用cocoapods导入其他的框架,发现调用的时候总是报错. Undefined sy ...

  2. codevs 1069 关押罪犯

    提交地址:http://codevs.cn/problem/1069/ 1069 关押罪犯 2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻 ...

  3. [APIO 2016]Gap

    Description 题库链接 给你一个长度为 \(N\) 的单调递增序列 \(A\) .交互时允许你调用 MinMax(s, t, &mn, &mx) 函数,表示序列元素的值在 \ ...

  4. [HNOI 2001]产品加工

    Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机 ...

  5. ●BZOJ 1692 [Usaco2007 Dec]队列变换

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1692 题解: 后缀数组,贪心由于每次可以取出旧队列的首部或尾部放在新队列的尾部.所以就需要比 ...

  6. NFC Spy:基于Android 4.4及以上手机的非接智能卡跟踪仪

    NFC Spy 用来查看读卡器和智能卡之间的指令.数据的交互传输过程,以便 NFC/HCE 开发者分析研究底层通讯协议,定位错误指令. 本程序要使用两部带有 NFC 硬件的 Android 手机,并且 ...

  7. python+eclipse+pydev开发环境搭建

    1.安装配置python2.7(右击我的电脑->属性->高级系统设置->环境变量->系统变量列表中找到Path并双击->变量值中添加";C:\Python27; ...

  8. Python中模块之shutil及zipfile&tarfile的功能介绍

    shutil的功能介绍及其他打包.压缩模块 1. shutil模块的方法 chown 更改指定路径的属组 2. copy 拷贝文件和权限 方法:shutil.copy(src,dst,*,follow ...

  9. jmeter正则表达式书写

    在测试过程中,经常会有以下几种场景,如A接口的返回值,用于B接口中,而且A登陆的账户,每次登陆,这个sid值还是变化的.那么在实际工作中,如何才能A接口中提取参数到B接口中?接下来我们就可以用正则表达 ...

  10. jquery 元素控制(追加元素/追加内容)介绍及应用

    http://blog.csdn.net/gisredevelopment/article/details/41126533 一.在元素内部/外部追加元素 append,prepend:添加到子元素  ...