结构体
会自动生成初始化去
-旦在定义结构体时自定义了初始化器,编译器就不会再帮它自动生成其他初始化器
类
类的定义和结构体类似,但编译器并没有为类自动生成可以传入成员值的初始化器
结构体与类区别
1、结构体是值类型(枚举也是值类型),类是引用类型(指针类型)
类 前8字节存指向类型信息 后8 引用类型
在Swift中,创建类的实例对象,要向堆空间申请内存,大概流程如下
Class._allocating_init()
libswiftcore.dylib:_swift_allocobject_
libswiftCore.dylib:swift_SLowALLoc
libsystem_malloc.dylib:malloc
在Mac、 ioS中的malloc函数分配的内存大小总是16的倍数
2、值类型
值类型赋值给var、let或者给函数传参,是直接将所有内容拷贝一份 口类似于对文件进行copy、 paste操作,产生了全新的文件副本。属于深拷贝(deep copy)
3、Copy On Write 未修改时采用浅拷贝
-
在Swift标准库中,为了提升性能,String、 Array、 Dictionary、 Set采取了Copy On Write
-
比如仅当有“写”操作时,才会真正执行拷贝操作
-
对于标准库值类型的赋值操作,Swift 能确保最佳性能,所有没必要为了保证最佳性能来避免赋值
4.引用类型
-
引用赋值给var、let或者给函数传参,是将内存地址拷贝一份
-
类似于制作—个文件的替身(快捷方式、链接),指向的是同一个文件。属于浅拷贝(shallow copy
5、方法
一般把定义在枚举、结构体、类内部的函数,叫做方法
方法存放在代码段
6、mutating
结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改
在func关键字前加amutating可以允许这种修改行为
函数调用后返回值未使用警告
@discardableResult