Swift 7: 属性观察者与计算属性

1:属性观察者(和OC中KVO原理相同)

1:属性观察者是用来观察属性变化前后的值

2:willSet【(newValue)】willSet方法在被观察的属性将要发生变化时调用该方法 该方法默认携带一个参数newValue 表示属性的新值

3:didSet【(oldValue)】didSet方法在被观察的属性已经变化之后调用该方法 这个方法也携带一个默认参数oldValue 表示属性的旧值
class Person {
    
    //一个属性带有一个观察者
    var age = 1 {
        
        willSet {
            //观察属性将要变化的值
            print("预祝你\(newValue)岁生日快乐")
        
        }
        didSet {
            //观察属性变化以后的值
            print("恭喜你从\(oldValue)岁到\(age)岁")
        }
    }
    
    //改变age的值
    func happyBirthday() -> Void {
        age += 1
    }
    
}

var xiaoPerson = Person.init()

for i in 1...6 {
    xiaoPerson.happyBirthday()
}

2:计算属性

1:计算属性不是属性是方法

2:计算属性在内存中是找不到变量的映射地址的

3:方法中嵌套了两个函数
(1)get函数 一定要有返回值 返回的就是计算的结果

(2)set函数 一定不能有返回值 是对某个属性赋值 set函数有一个自带的形参newValue 携带的就是为某个属性符的值

4:计算属性的get和set方法可以不同时出现 如果只是对某个属性赋值而不需要返回 那么只需要写set方法就可以 如果某个属性是只读的不能修改 那么只需要写get方法
//计算圆的面积
class Circle {
    
    var radio: Double = 0.0
    
    var getArea: Double {
        
        get {
            
            return radio * radio * M_PI
        }
        set {
           
            radio = newValue
        }
    }
}

var c = Circle.init()
c.getArea = 10 //自动调用set方法赋值
print(c.getArea)//自动调用get方法获取值

3.计算属性通常用于下标

1:字符串的下标指的是index类型的数据。 比如 string[string.startIndex]根据下标获取字符串中第一个字符

2:数组下标获取下标对应的元素  数组的下标从0开始 arr[0]获取数组中第一个元素

3:字典下标获取是对应的value值 字典的下标是key值 dic["one"]

4:类或者结构体的成员变量也可以通过下标获取 --- 就是对成员变量访问的另一种方法。成员变量的下标从0开始

5. 定义下标的关键字
 subscript(参数列表)->返回值类型 {
 
 
 }
 (1)参数列表指的就是下标的值 是Int类型 不能添加外部参数名称 不能为参数赋初值
 (2)返回值类型可以是任意类型

程序举例如下

class Rect {
    var pointX: Int = 0
    var pointY: Int = 0
    var width: Int = 0
    var height: Int = 0
    var test: String = ""
    
    //使用下标对成员变量进行赋值和获取
    subscript(index: Int) -> AnyObject {
    
        get {
            switch index {
                
            case 0:
                return self.pointX
            case 1:
                return self.pointY
            case 2:
                return self.width
            case 3:
                return self.height
            default:
                return self.test
                
            }
        }
        set {
            
            switch index {
            case 0:
                self.pointX = Int(newValue as! NSNumber)
            case 1:
                self.pointY = Int(newValue as! NSNumber)
            case 2:
                self.width = Int(newValue as! NSNumber)
            case 3:
                self.height = Int(newValue as! NSNumber)
            default:
                self.test = newValue as! String
            }
        }
    }
}
var rect = Rect.init()
rect[0] = 10
rect[1] = 20
rect[2] = 30
rect[3] = 40
rect[4] = "hello"
print(rect[0],rect[3],rect[4])

你可能感兴趣的:(Swift 7: 属性观察者与计算属性)