OC中也有类,结构体,枚举。但是 到了Swift中,我发现实际的应该却远远超过OC,而且强大之处之后我们真正用了才知道,那么他们之间到底有什么区别呢?
即枚举类型、结构类型(包括基本类型,基本类型实际都是结构类型的特例)、类。
类型区别
- 类是引用类型
- 引用类型(reference types,通常是类)被复制的时候其实复制的是一份引用,两份引用指向同一个对象。所以在修改一个实例的数据时副本的数据也被修改了(s1、s2)。
- 枚举,结构体是值类型
- 值类型(value types)的每一个实例都有一份属于自己的数据,在复制时修改一个实例的数据并不影响副本的数据(p1、p2)。值类型和引用类型是这三兄弟最本质的区别。
mutating
值类型的属性不能在实例方法中被修改,但是有时候你确实想修改过,这时候 你可以使用变异方法 。关键字 mutating
总结
枚举、结构体、类的共同点:
定义属性和方法;
下标语法访问值;
初始化器;
支持扩展增加功能;
可以遵循协议;
类特有的功能:
继承;
允许类型转换;
析构方法释放资源;
引用计数;
我该如何选择
关于在新建一个类型时如何选择到底是使用值类型还是引用类型的问题其实在理解了两者之间的区别后是非常简单的,在这苹果官方已经做出了非常明确的指示(以下内容引自苹果官方文档):
当你使用Cocoa框架的时候,很多API都要通过NSObject的子类使用,所以这时候必须要用到引用类型class。在其他情况下,有下面几个准则:
1.什么时候该用值类型:
要用==运算符来比较实例的数据时
你希望那个实例的拷贝能保持独立的状态时
数据会被多个线程使用时
2.什么时候该用引用类型(class):
要用==运算符来比较实例身份的时候
你希望有创建一个共享的、可变对象的时候