Swift中类与结构体的区别

结构体

Bool、Int、Double、String、Array、Dictionary等常见的类型都是结构体
● 结构体都有一个编译器自动生成的的初始化器(initializer,初始化方法,构造器,构造方法)
● 编译器根据情况可能会为结构体生成g多个初始化器,保证所有成员都有初始值
● 定义结构体时在结构体内自定义了初始化器,编译器j就不会生成t其他的初始化器

结构体的定义:
结构体有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
   }
}

上面两种的效果一样。

值类型

值类型给 let、var 赋值或者给函数传参时,是直接将所有内容拷贝一份,属于深拷贝
Swift 标准库中为了提升性能,String、Array、Dictionary、Set 采取 Copy On Write 的技术(仅当有"写"的操作时才会真的进行拷贝操作)

引用类型

引用类型给 let、var 赋值或者传参,是将储存的内存地址拷贝一份

你可能感兴趣的:(Swift中类与结构体的区别)