理解Swift中Extension类型
3.times { puts 'hello world' } |
这是一条 Ruby 语句,它会打印 hello world
三次,意图清晰,语法简洁。
如果你是 C 或者 Java 等语言的使用者,而从未接触过 Ruby,此时是不是有种打开了新世界的大门的感觉^_^。反正当初我刚接触 Ruby 那会儿时常会感叹,啊原来代码还可以这么写。。。Ruby 的灵活与优雅当然远不仅于此,这里就不展开了。今天的重点是,Swift 也可以这么写。
首先我们要明确,Ruby 之所以可以这么写是因为它是一个纯面向对象的语言,在 Ruby 的世界中,一切皆对象,所有的事物都有一个共同的祖先——Object。3 的类型是 Fixnum,当然也是一个对象,所以它有自己的方法。times 就是一个方法,可以看出应该是接收一个代码块(本例中为 {puts 'hello world'}
),然后调用它 self(本例中 self 即为 3)次。
而在 Swift 中,Int 是一个 struct(结构体),并不是个 class。但是 Swift 中的 struct 与别的语言中的 struct 不同的是,struct 内部也可以定义方法。所以条件满足了,现在就差个 times 方法了。
嗯,很遗憾 Swift 的 Int 并没有 times 方法。不过没关系,这个时候 extension
就派上用场了。没有我们就自己写一个嘛,私人化定制,满足一切突如其来的需求。先上代码好了:
定义:
extension Int { |
调用: 3.times { println("hello world") }
是不是跟开头 Ruby 语句有异曲同工之妙?extension
不仅可以扩展方法,还可以扩展计算属性。比如《The Swift Programming Language》中的一个例子:
extension Double { |
extension
在实际的开发中可以有很多应用,使用得当能显著提高代码的可读性,平常我们自己写的大多数辅助类其实都可以转化为 extension
。譬如我最近在自己的项目中给被点击的 UIView(比如 button)写了一个小动画,点击了之后组件会上浮一下,并且同时会有一下阴影效果。
定义:
extension UIView { |
使用(仅点击动画部分代码):
button.addTarget(viewCtrl, action: "clicked:", forControlEvents: .TouchUpInside) |
大概就是右上角的效果,呃,静态图看不出来,各位要是有兴趣可以拿我的扩展方法然后自己初始化个 Button 去跑跑看 (直接 sender.animateWhenClicked()
就好,不用 superview)
。因为我在项目中的 Button 是一个自定义的贪婪 Button,只要点击 Button 的父视图就会响应点击事件,所以是 Button 的 superview 调用了 animateWhenClicked,这也是我把这个动画扩展到 UIView 而不是 UIButton 的原因。
我个人很喜欢 extension
,平常也经常使用。extension
也可用于后期项目维护,可以在不修改旧代码的前提下扩展旧代码的功能。而且对于 NSObject
的子类或者有 dynamic 标记的方法,利用扩展还可以在运行时对某些方法的实现进行替换,类似于 OC 的 Swizzle,今天就不展开了,下次有空继续。
文/Sheepy
原文链接:http://www.jianshu.com/p/f41bf33fac0b
The Why·Liam·Blog by WhyLiam is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由WhyLiam创作并维护的Why·Liam·Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Why·Liam·Blog (https://blog.naaln.com),版权所有,侵权必究。
本文永久链接:https://blog.naaln.com/2016/07/extension-swift/