Struct 和 Class 之间的区别?
Struct 和 Class 之间其实大部分都很相似:
-
定义属性
-
定义方法(Struct 修改属性的方法需要 mutating)
-
定义构造器
-
可以拓展extension(增加计算属性和方法)
-
遵循协议
不过也有5个区别:
-
Struct 有默认成员构造器,__Class__ 没有,需要人手写构造器
原因是:第二个区别,因为 Class 有继承,如果有默认成员构造器,当父类中的属性被删除或者增加,那么原来的成员构造器就不可用了,那这时候代码可想而知,所以 Class 的构造器是需要手动写的 。
-
Struct 不能继承,__Class__ 可以继承(也是单继承)
-
Struct 没有析构器,__Class__ 有析构器
原因是:__Struct__ 是值类型,值类型实例的数据永远都只是自己,只要自己销毁了那就销毁了,销毁时没有什么特殊的需要处理的,所以不需要。而 Class 是引用类型,引用类型是通过 ARC 引用计数来确定一个类的对象是否释放的,当引用计数=0时 Swift 就会调用析构器销毁对象。
-
常量 Struct 实例 不能修改 Struct 中定义的变量属性。常量 Class 实例可以修改 Class 中定义的变量属性。
这个也是有 Struct 是值类型,__Class__ 是引用类型决定的。值类型不管有多少属性和多少方法,都是一个简单的值(像 Int 类型的 5),而对一个值内部的属性进行更改,说明这个值已经和原来的那个不一样了,这意味着需要重新创建一个并赋值给当前这个常量变量,而这在 Swift 是不可能的。而引用类型不同,引用类型只是指针指向类实例所在的内存块,常量引用仅仅是该引用不可变,但是不影响对实例中定义的变量属性的修改。
-
Struct 的复制是深复制,__Class__ 的复制不是
也是和 Struct 是值类型,__Class__ 是引用类型有关。__Struct__ 是值类型,复制是会将所有的属性值以及方法数据复制到一个不同的内存数据区,和原来的值是不同的实例,改变其中一个,不影响另外一个。而引用类型复制仅仅只是新建了一个指针,但是指向的实例还是原来的实例,因此改变其中一个,另一个也会跟着改变。
用 Struct 还是 Class ?
Struct 和 Class 的区别就是以上5个,到底在程序中使用哪个,这个只能说由个人开发习惯喜好决定了,当需要使用 Class 时那肯定是需要利用 Class 以上的5个区别于 __Struct__的特性了。需要注意的是:
-
当数据量比较大,而且使用的地方很多时,使用 Class 会 比 Struct 更合适,因为 Struct 实例在使用过程中会大量的 copy ,而数据量大时,那这明显是会使程序变慢的
原文始发于微信公众号(三万之一):Swift 之 Struct 与 Class
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/231216.html