Swift中方法(method)所谓的lazy绑定简介

前端之家收集整理的这篇文章主要介绍了Swift中方法(method)所谓的lazy绑定简介前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我们知道在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的简洁哦!

@H_918_301@

猜你在找的Swift相关文章