[TOC]
@(swift)[温故而知新]
面试中经常被问到Objective-C与Swift的区别,其实区别还是很多的,重点整理一下个人觉得很重要的:面向协议编程。
一、Objective-C与Swift的异同
1.1、swift和OC的共同点:
– OC出现过的绝大多数概念,比如引用计数、ARC(自动引用计数)、属性、协议、接口、初始化、扩展类、命名参数、匿名函数等,在Swift中继续有效(可能最多换个术语)。
– Swift和Objective-C共用一套运行时环境,Swift的类型可以桥接到Objective-C(下面我简称OC),反之亦然
1.2、swift的优点:
– swift注重安全,OC注重灵活
– swift注重面向协议编程、函数式编程、面向对象编程,OC注重面向对象编程
– swift注重值类型,OC注重指针和引用
– swift是静态类型语言,OC是动态类型语言
– swift容易阅读,文件结构和大部分语法简易化,只有.swift文件,结尾不需要分号
– swift中的可选类型,是用于所有数据类型,而不仅仅局限于类。相比于OC中的nil更加安全和简明
– swift中的泛型类型更加方便和通用,而非OC中只能为集合类型添加泛型
– swift中各种方便快捷的高阶函数(函数式编程) (Swift的标准数组支持三个高阶函数:map,filter和reduce,以及map的扩展flatMap)
– swift新增了两种权限,细化权限。open > public > internal(默认) > fileprivate > private
– swift中独有的元组类型(tuples),把多个值组合成复合值。元组内的值可以是任何类型,并不要求是相同类型的。
1.3、swift的不足:
– 版本不稳定
– 公司使用比例不高,使用人数比例偏低
– 有些语法其实可以只规定一种格式,不必这样也行,那样也行。像Go一样禁止一切(Go有点偏激)耍花枪的东西,同一个规范,方便团队合作和阅读他人代码。
Swift 跟 JavaScript 有什么相同和不同点?
从数据结构角度,Golang和Swift对比,有何优缺点?
iOS——Objective-C与Swift优缺点对比
二、swift类(class)和结构体(struct)的区别
2.1 定义
class Class { // class definition goes here}struct Structure { // structure definition goes here}
2.2 值 VS 引用
1、结构体 struct 和枚举 enum 是值类型,类 class 是引用类型。
2、String, Array和 Dictionary都是结构体,因此赋值直接是拷贝,而NSString, NSArray 和NSDictionary则是类,所以是使用引用的方式。
3、struct 比 class 更“轻量级”,struct 分配在栈中,class 分配在堆中。
2.3 指针
如果你有 C,C++ 或者 Objective-C 语言的经验,那么你也许会知道这些语言使用指针来引用内存中的地址。一个 Swift 常量或者变量引用一个引用类型的实例与 C 语言中的指针类似,不同的是并不直接指向内存中的某个地址,而且也不要求你使用星号(*)来表明你在创建一个引用。Swift 中这些引用与其它的常量或变量的定义方式相同。
2.4 选择使用类和结构体
使用struct:任何情况下,优先考虑使用struct,如果满足不了,再考虑class
– 比如数据被多线程使用,而且数据没有使用class的必要性,就使用struct
– 希望实例被拷贝时,不收拷贝后的新实例的影响
– 几何图形的大小,可以封装width和height属性,都是Double类型
– 指向连续序列范围的方法,可以封装start和length属性,都是Int类型
– 一个在3D坐标系统的点, 可以封装x, y和z属性,都是Double类型
使用class
– 需要继承
– 被递归调用的时候(参考链表的实现,node选用class而不是struct)
– 属性数据复杂
– 希望引用而不是拷贝
参考链接1:类和结构体 参考链接2:官方文档
三、Objective-C中的protocol与Swift中的protocol的区别
相比于OC,Swift 可以做到protocol协议方法的具体默认实现(通过extension)相比多态更好的实现了代码复用,而 OC 则不行。
四、面向协议(面向接口)与面向对象的区别
面向对象和面向协议的的最明显区别是对抽象数据的使用方式,面向对象采用的是继承,而面向协议采用的是遵守协议。在面向协议设计中,Apple建议我们更多的使用 值类型 (struct)而非 引用类型 (class)。这篇文章中有一个很好的例子说明了面向协议比面向对象更符合某些业务需求。其中有飞机、汽车、自行车三种交通工具(均继承自父类交通工具);老虎、马三种动物(均继承父类自动物);在古代马其实也是一种交通工具,但是父类是动物,如果马也有交通工具的功能,则:
如果采用面向对象编程,则需要既要继承动物,还要继承交通工具,但是父类交通工具有些功能马是不需要的。由此可见继承,作为代码复用的一种方式,耦合性还是太强。事物往往是一系列特质的组合,而不单单是以一脉相承并逐渐扩展的方式构建的。以后慢慢会发现面向对象很多时候其实不能很好地对事物进行抽象。