正文

/*
 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"

}