swift 4.2 官方文档学习笔记(八)- Structures and Classes

Sellen Wei
Dec 15, 2018

--

这一章会讲到 类和结构体(中文 英文),class是比较常用的,但是struct我很少使用,那接下来就看看两者的区别以及什么时候会使用struct

Classes have additional capabilities that structures don’t have:

Inheritance enables one class to inherit the characteristics of another.(可以允许类继承另一个类)

Type casting enables you to check and interpret the type of a class instance at runtime. (class可以在运行时被检查,我想这个应该是类似于kindOfClass之类的check,可以在运行时检查类的类型)

Deinitializers enable an instance of a class to free up any resources it has assigned.(释放某个object时,会同时将所有分配的资源释放)

Reference counting allows more than one reference to a class instance.(类可以有多于一个的指针指向它)

  1. class 和struct 的初始化:

2. 重要的事情说三遍!!!structure是值拷贝!值拷贝!值拷贝!和enum一样,它叫做Value type,和class的reference type不一样!!不一样!不一样!问问自己赋值时的差别是什么?

3. 对于类来说,由于是reference type, 我们可以用运算符来判断两个不同的指针(但要注意swift中的指针不完全是objc中指针的定义)是否指向同一个object地址,这两个运算符就是=== 和 !== “相同于”意味着两个类类型常量或者变量引用自相同的实例;

4. 那么究竟什么时候应该使用结构体呢?

结构体的主要目的是为了封装一些相关的简单数据值;

当你在赋予或者传递结构实例时,有理由需要封装的数据值被拷贝而不是引用;

任何存储在结构体中的属性是值类型,也将被拷贝而不是被引用;

结构体不需要从一个已存在类型继承属性或者行为。

不过大部分的情况下,似乎不太建议使用结构体,所以只要知道区别,能够读懂就可以了,还是多多使用class,灵活度更高,可以继承。

2021.7.14补充:fb和uber的指导文档里面都有提出尽量的使用struct而减少class,这是因为struct的体量更小,更方便加载,在app size上很有优势

5. waw,差点漏掉了这个,swift和objc中collection的类型居然不一样:

Swift 的 String , Array 和 Dictionary类型是作为结构体来实现的,这意味着字符串,数组和字典在它们被赋值到一个新的常量或者变量,亦或者它们本身被传递到一个函数或方法中的时候,其实是传递了拷贝。

这种行为不同于基础库中的 NSString, NSArray和 NSDictionary,它们是作为类来实现的,而不是结构体。 NSString ,NSArray 和 NSDictionary实例总是作为一个已存在实例的引用而不是拷贝来赋值和传递。

--

--