Swift中结构体和类的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中结构体和类的区别相关的知识,希望对你有一定的参考价值。

两者之间的关系
定义:结构体有0个或多个相同或者不同的数据组合而成的数据集合,其中那些数据或者方法被称为结构体的成员或者是成员方法。
格式:
struct name:<:protocal>

var 成员1:数据类型
var 成员2:数据类型
….

要注意的地方:
结构体是值类型,其 实例将会被赋予变量或者常量和被函数调用时被复制
结构体中的成员可以包括属性、类型别名、数组、其他结构体和枚举声明
结构体声明不能包含析构器或者协议声明,但是可以包括任意协议的实现,不能继承类、枚举、其他结构体
两者间的区别
在我们实际的开发中,可能会纠结于应该是使用类还是结构体,在这里我也总结了一下类与结构体间的一些区别。
结构体:
///MARK: - 结构体
struct Car

var name: String!
init(name: String)
self.name = name


var p1 = Car(name: "bench")
var p2 = p1
p2.name = "BMW"
print(p2.name,p1.name)
/// 打印结果为BMW,bench
类:
///MARK: - 类
class Car

var name: String!
init(name: String)
self.name = name


var p1 = Car(name: "bench")
var p2 = p1
p2.name = "BMW"
print(p1.name,p2.name,p1.name)
/// 打印结果为BMW,BMW,BMW
从上面的结果可以看出来,再次给对象赋值,结构体不会改变,而类则会改变原来的值,所以说明类的对象是引用类型,而结构体是值类型。
还有的区别就是类是属于面向对象编程,结构体属于面向协议的编程,所谓面向协议编程其实就是面向对象的升级。在swift中推荐使用的是使用结构体,类在swift中不处于主流的地位,还有就是结构体也能够实现类的全部功能,结构体更模块化,默认实现初始化方法并且不用考虑ARC。
结构体只需要给出变量的类型,不用给出初始值
struct car
var name: String

类则需要给出初始值
class car
var name: String
init(name:String)
self.name = name


上面两种的效果一样。
参考技术A 有几个区别,这个可以去苹果官网细看。最主要的就是内存的占用。我举个例子。假如我有一个类,叫做Resolution,其中有width和height两个Int变量,那么我可以用let初始化一个Resolution实例,并且可以改变其两个属性。比如:

类的定义:
class Resolution
var width = 0
var height = 0

init(_ w: Int, _ h: Int)
width = w
height = h



let r = Resolution(10, 10)
那么这时,常量r存的不是一份resolution的数据,而是这个数据在电脑内存里的路径和位置(pointer的意思)。因此,如果我再写
let r2 = r
r.width = 0
print(r2.width) // 也变成0了,因为两个常量不是单独存了一份resolution,而是存了指向同一内存的路径。

相反,如果 Resolution是个struct(替换class关键词),那么每个实例需要使用var来进行更改,而且每个变量存的是数据本身,而不是内存路径:

var r = Resolution(10, 10)
var r2 = r
r2.width = 0
print(r.width) // 10

常见的结构体:String, Array, Dictionary等swift数据结构
常见的类:NSView, NSString, NSArray, NSDictionary, DispatchQueue等等。如果需要分配很多内存,建议用class,如果系很小的数据,用struct。本回答被提问者采纳

以上是关于Swift中结构体和类的区别的主要内容,如果未能解决你的问题,请参考以下文章

Swift-Class和Struct的区别(结构体和类的区别)

结构体和类的区别,联系

结构体和类的区别?

结构体和类的唯一区别就是类函数没有加说明是私有而结构体函数是公有

swift结构体和类属性-005-swift类结构体基本属性

结构和类的区别及结构的使用