本文主要面向初学swift的同学们,大神们可略过。主要总结了一些Swift与OC相同关键词的差异,避免熟悉OC的同学们因经验主义引起的错误。
Swift之协议
熟悉objective-c语言的同学们肯定对协议都不陌生,在Swift中苹果将protocol这种语法发扬的更加深入和彻底。这里不对OC的protocol过多介绍,主要来讲protocol在Swift与OC中的主要差异。
Swift协议定义
协议为方法、属性、以及其他特定的任务需求或功能定义蓝图。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足了协议中需求的任意类型都叫做遵循了该协议(引自文档官方文档)。
可以看到在Swift中协议不仅为类提供功能的具体实现,也同样可以为结构体、或枚举类型所提供。喵神也在自己博文 《面向协议编程与 Cocoa 的邂逅》中说到:Swift中几乎所有的实际类型都是满足若干协议的。protocol 是 Swift 语言的底座,语言的其他部分正是在这个底座上组织和建立起来的。Swift是更面向protocol的语言,比起OC面向对象有很大不同。由此看来protocol在Swift中的地位。
一个简单的Swift协议定义如下:
1 | protocol Student { |
值得注意的是Swift协议内的属性需要明确规定该属性是可读的get、还是可读可写的get set。另外还可以通过关键字static声明一个类型属性(下面我会单独分析Swift与OC中static关键字的区别)。
Swift协议扩展
所谓协议扩展,就是我们可以为一个协议提供默认的实现。对于 Student,可以在 extension Student 中为 study的方法 添加一个doHomeWork的实现如下:
1 | extension Student { |
不仅如此,除了已经定义过的方法,我们甚至可以在扩展中添加协议里没有定义过的方法。在这些额外的方法中,我们可以依赖协议定义过的方法进行操作。
说到这里,我相信有的同学已经发现了协议扩展的作用了,没错使用Swift协议和协议扩展,我们可以很好地共享代码,完美解决了OC面向对象引起的横切关注点的问题,不熟悉的同学可以参考 喵神的《面向协议编程与 Cocoa 的邂逅》这篇文章。通过协议扩展,我们只需要把所需要的公共方法,写到协议扩展内,这样接受协议的对象就都拥有了此方法,不必像OC那样再通过继承或者创建基类来实现了。
Swift关键字之static和class
这里我主要谈一下Swift中static和class的区别,以及这两个关键字在Swift和OC里的差异。
Swift中static和class的区别
在Swift方法的func关键字之前加上关键字static或者class都可以用于指定类方法。不同的是用class关键字指定的类方法可以被子类重写,但是用static关键字指定的类方法是不能被子类重写的, 根据报错信息: Class method overrides a ‘final’ class method.
我们可以知道被static指定的类方法包含final关键字的特性–防止被重写.(此处不是我所讲重点,详细可参考这篇博客)
static在Swift和OC里的区别
首先请博友和我一起复习下,OC里static的作用:
static修饰局部变量:
在static修饰局部变量时,可以延长局部变量的生命周期,只要程序运行中,局部变量就会一直存在。
用static修饰的局部变量,只会分配一次内存,只有在程序第一次启动时执行一次,以后不会再次执行。
static修饰全局变量:
static修饰全局变量时,只会修改全局变量的作用域,表示只能在当前文件内使用。
以上是我初步对static在OC内主要作用的总结,如有忽略处还请博友提出以便完善。
写到这里我们已经可以明显看出static在Swift和OC里的区别了,我也就不再废话了。(此篇博客是小主首次尝试,还希望各位博友多多批评指教)。