正文
/*
1: 属性
1.1:属性可以将值与特定的类、结构体或者是枚举联系起来。
1.2:存储属性会存储常量或变量作为实例的一部分,反之计算属性会计算(而不是存储)值。
1.3:计算属性可以由类、结构体和枚举定义。
1.4: 存储属性只能由类和结构体定义。
2: 存储属性
3: 延迟存储属性 lazy
4: 计算属性 get set 方法
5: 属性观察器 定义属性观察器来检查属性中值的变化,这样你就可以用自定义的行为来响应。
你可以在如下地方添加属性观察者:
你定义的存储属性;
你继承的存储属性;
你继承的计算属性。
6: 全局和局部变量
7: 类型属性
8:类型包装
*/
import UIKit
import Foundation
class TenPropertyVC: UIViewController {
var origin = CGPoint()
var size = CGSize()
// 1: 存储属性 get和set
var center: CGPoint {
get {
let centerX = origin.x + size.width / 2
let centerY = origin.y + size.height / 2
return CGPoint(x: centerX, y: centerY)
}
// 如果一个计算属性的设置器没有为将要被设置的值定义一个名字,那么他将被默认命名为 newValue 。
set {
origin.x = newValue.x - size.width / 2
origin.y = newValue.y - size.height / 2
}
}
/* 2: 属性观察者
你可以在如下地方添加属性观察者:
你定义的存储属性;
你继承的存储属性;
你继承的计算属性。
对于继承的属性,你可以通过在子类里重写属性来添加属性观察者。对于你定义的计算属性,使用属性的设置其来观察和响应值变化,而不是创建观察者。
willSet 会在该值被存储之前被调用。
didSet 会在一个新值被存储后被调用。
*/
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
self.title = "10:属性"
var stepCounter = StepCounter()
stepCounter.totalSteps = 1 // 调用willSet方法
let total = stepCounter.totalSteps // 调用didSet方法
print(total)
// 类型属性,是类的属性,相当于加号方法,加号属性
print(StepCounter.classProperty)
}
}
class StepCounter {
/* 2: 属性观察者
你可以在如下地方添加属性观察者:
你定义的存储属性;
你继承的存储属性;
你继承的计算属性。
对于继承的属性,你可以通过在子类里重写属性来添加属性观察者。对于你定义的计算属性,使用属性的设置其来观察和响应值变化,而不是创建观察者。
willSet 会在该值被存储之前被调用。
didSet 会在一个新值被存储后被调用。
*/
var totalSteps: Int = 0 {
willSet(newData) {
print("newValue=\(newData)")
}
didSet(oldData) {
print("oldValue=\(oldData)")
}
}
static var classProperty = "a"
}