Swift中的struct和class

提到struct其实并不陌生,OC中的CGPointCGSizeCGRect等其本质都是结构体。在结构体中可以定义成员变量(属性),但是不能定义方法。形如:

struct CGRect {
    CGPoint origin;
    CGSize size;
}
typedef struct CGRect CGRect;

Swift中的结构体强大了许多,不但可以定义属性,还可以定义方法。所以在Swift中,struct可以看做一种轻量级的class

值类型和引用类型

值类型的变量直接包含他们的数据,对于值类型都有他们自己的数据副本,因此对一个变量操作不会影响另一变量。可以理解为深拷贝,也就是内容拷贝。赋值的时候会开辟新的内存地址,并将当前的内容复制。
引用类型的变量存储对他们的数据引用,因此对一个变量操作可能会影响另一个变量所引用的对象。可以理解为浅拷贝,也就是指针拷贝。赋值的时候会保有一份内存地址重复使用。

而在Swift中,struct是值类型,而class是引用类型。在Objective-C中,引用类型占据了很大比重,比如常用的NSArrayNSDictionaryNSStringUIKit等都是引用类型,而NSIntegerCGFloatCGRect等是值引用。但是到了SwiftNSArrayNSDictionaryNSString这些都是基于struct实现的。

为什么Swift中大量使用struct

  • struct是值引用,而class是类型引用
  • struct没有继承的功能,class有继承功能

首先第一点就是因为struct值引用class类型引用这个区别,保证使用struct能写出安全可靠的代码。因为当你共用同一块内存时,可能会出现潜在的错误,而struct则保证不会出现类型的问题。第二个是因为继承,Swift是面向协议(Protocol)编程,struct并不需要继承,如果要实现某个功能,去遵守并实现某个协议就好了。所以使用struct可以使代码更加安全可靠,并且更加符合面向协议编程

comments powered by Disqus