一、Swift中跟实例相关的属性可以分为2大类
1、存储属性(Stored Property) 类似于成员变量这个概念
存储在实例的內存中 结构体、类可以定义存储属性 枚举不可以定义存储属性
2、计算属性( Computed Property) 本质就是方法(函数)
不占用实例的内存 枚举、结构体、类都可以定义计算属性
二、关于存储属性,Swift有个明确的规定
在创建类 或结构体的实例时,必须为所有的存储属性设置一个合适的初始值
可以在初始化器里为存储属性设置一个初始值 可以分配一个默认的属性值作为属性定义的一部分
三、枚举原始值原理
s .rawValue() 只读的计算属性
四、延迟存储属性
第一次用到属性的时候才会进行调用
必须是var
lazy var car = Car()
lazy var image: Image = {
return UIImage(named: "")
}()
对于结构体 lazy 初始化时不能用let 拿到结构体lazy修饰属性
五、属性观察器
可以应用全局变量,局部变量
wiLlSet会传递新值,默认叫newValue
didSet会传递旧值,默认叫oldValue
在初始化器中设置属性值不会触发wil1Set和d idSet
在属性定义时设置初始值也不会触发wiLLSet和didSet
var radius: Double {
willSet {
}
didSet {
}
}
六、inout的本质
如果实参有物理内存地址,且没有设置属性观察器
直接将实参的内存地址传入函数(实参进行引用传递)
1如果实参是计算属性 或者 设置了属性观察器
采取了Copy Irt Copy Out的做法
(调用该函数时,先复制实参的值,产生副本 【get]
将副本的内存地址传入函数(副本进行引用传递),在函数内部可以修改副本的值
函数返回后,再将副本的值覆盖实参的值 【set)
七、类型属性
口类型属性(Type Property):只能通过类型去访问
存储类型属性(Stored Type Property):整个程序运行过程中,就只有1份內存(类似于全局变量)
计算类型属性 ( Computed Type Property)
可以通过static定义类型属性
口如果是类,也可以用关键字class
单利
class FileManager {
public static let shared = FileManager()
private init() {}
}