结构体
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 赋值或者传参,是将储存的内存地址拷贝一份