美文网首页iOS 开发 iOS DeveloperiOS-swift
Swift 7: 属性观察者与计算属性

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

作者: 前进的苏辰 | 来源:发表于2016-08-11 19:53 被阅读0次

    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: 属性观察者与计算属性

        本文链接:https://www.haomeiwen.com/subject/ywsssttx.html