swift 属性
2021-12-21 本文已影响0人
奋斗的小马达
属性种类
swift属性分为两种
1、存储属性
注意⚠️:
类似与成员变量这个概念
存储在实例的内存中(堆空间)
结构体、类可以定义存储属性 (枚举是不可以定义存储属性的)
struct Point {
var x:Int
var y:Int
}
// x 和 y 就是存储属性
2、计算属性
注意⚠️:
计算属性的本质是方法(函数)
不占用实例对象的内存
定义计算属性只能使用var 不能使用let
因为:let 代表常量 值是一成不变的, 计算属性的值可能发生变化(即使是只读计算属性)
struct Circle {
var radius:Double
var diamater:Double{
set{
radius = newValue
}
get{
radius*2
}
}
}
// diamater 就是计算属性
//如果有 set 和 get 方法 证明这个计算属性 是可读可写的计算属性
//如果 只有get方法 则证明这个计算属性是只读属性
延迟存储属性
使用lazy 可以定义一个延迟存储属性 在第一次用到属性的时候才会进行初始化
注意⚠️:
延迟存储属性必须是var 不能是let
因为:swift 有严格的规定 let必须在实例的初始化方法完成之前就拥有值
如果多条线程同时第一次访问 Lazy属性 就无法保证属性只会初始化一次
当结构体包含一个延迟存储属性时,只有var才能访问延迟存储属(如下图)
因为延迟属性初始化时需要改变结构体的内存(类可以)
截屏2021-12-21 下午5.24.46.png
这个p不能使用let 只能使用var
struct Point {
var x:Int
var y:Int
lazy var z:Int = 0
}
//这个 z 就是延迟存储属性
属性观察器
可以为非lazy的var存储属性设置属性观察器(类似KVO)
struct Circle {
var radius: Double {
willSet {
print("willSet", newValue)
}
didSet {
print("didSet", oldValue, radius) }
}
init() {
self.radius = 1.0
print("Circle init!") }
}
var circle = Circle()
// willSet 10.5
// didSet 1.0 10.5
circle.radius = 10.5
//willSet会传递新值,默认叫newValue
//didSet会传递旧值,默认叫oldValue
//在初始化器中设置属性值不会触发willSet和didSet
//在属性定义时设置初始值也不会触发willSet和didSet