概念
存储属性(Stored Property)
- 类似于成员变量的这个概念
- 存储在实例的内存中
- 结构体、类可以定义存储属性
- 枚举不可定义存储属性
- 在创建类或结构体的实例时,必须为所有的存储属性设置一个合适的初始值
- 可以在初始化器里为存储属性设置一个初始值
- 可以分配一个默认的属性值作为属性定义的一部分
计算属性(Computed Property)
- 本质就是方法(函数)
- 不占用实例的内存
- 枚举、结构体、类都可以定义计算属性
- 计算属性只能用var不能let,let代表常量:值是一成不变的。计算属性的值是可能发生变化的(即使是只读计算属性)
struct Circle {
//存储属性
var radius : Double
//计算属性
var diameter:Double {
set {
radius = newValue / 2
}
get {
radius * 2
}
}
}
var circle = Circle(radius: 10)
print(circle.radius)
print(circle.diameter)
计算属性

set可以没有 get必须有
set-newValue
set 传入的新值默认叫做newValue,也可以自定义
set(newDiameter) {
radius = newDiameter / 2
}
get
只读 赋值报错
struct Circle1 {
var radius: Double
var diameter:Double {
get {
radius * 2
}
}
}
var circle1 = Circle1(radius: 10)
print(circle1.diameter)
简写
var diameter:Double {
radius * 2
}
延迟存储属性

class Car {
init() {
print("Car init!")
}
func run() {
print("Car is running!")
}
}
let car = Car()
car.run()
class Person {
lazy var car = Car()
init() {
print("Person init")
}
func goOut() {
car.run()
}
}
let person = Person()
person.goOut()
- 使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化
- 当结构体包含一个延迟存储属性时,只有var 才能访问延迟存储属性,因为延迟属性初始化时需要改变结构体的内存
struct Point {
var x:Int = 0
var y:Int = 0
lazy var z = 0
}
var point = Point()
point.z = 0
属性观察器 (Property Observer)
- 必须初始化哦
- 可以为非lazy的var存储属性设置属性观察器
- willSet会传递新值,默认叫newValue
- didSet会传递旧值,默认叫oldValue
- 在初始化器中设置属性值不会触发willSet和didSet
- 在属性定义时设置初始化值也不会willSet和didSet
结构体里面
func PropertyObserver() {
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()
print(circle.radius)
circle.radius = 2.0
}
变量中应用 (需要初始化哦)
var num1:Int = 10{
willSet {
print("willSet",newValue)
}
didSet {
print("didSet oldValue = \(oldValue)")
}
}
num1 = 300
print(num1)
类型属性
struct Dog {
static var count:Int = 0
init() {
Dog.count += 1
}
}
let dog = Dog()
print(Dog.count)
网友评论