美文网首页
每天学一点Swift----面向对象上(六)

每天学一点Swift----面向对象上(六)

作者: 冯可乐同学 | 来源:发表于2017-05-28 10:03 被阅读6次

    九.观察者属性

    1.为了让程序能在属性被赋值时获得执行代码的机会,Swift提供了属性观察者机制,*******属性观察者其实就是两个特殊的回调方法:

    willSet(newValue)----被观察的属性即将被赋值之前自动调用该方法。

    didSet(oldValue)----被观察的属性被赋值完成之后自动调用该方法。

    2.只要程序对非延迟存储的存储属性赋值----即使所赋的值与原有的值相等,属性观察者也能监听到。

    3.属性观察者可以监听如下属性的改变:

    (1)除了延迟存储属性之外的所有存储属性(包括实例存储属性和类型存储属性)

    (2)可通过重载方式为继承得到的属性(包括存储属性和计算属性)添加属性观察者

    4.不要为没有重载的、普通的计算属性添加属性观察者----因为没有意义。当程序对计算属性赋值时,计算属性的setter方法已经得到了执行,程序在setter方法中想做什么都可以。

    5.定义属性观察者的语法:

    [修饰符]var存储属性名:属性类型[=初始值]{

    willSet(newValue){

    //属性即将被赋值之前自动执行的代码

    }

    didSet(oldValue){

    //属性被赋值之后自动执行的代码

    }

    }

    6.定义属性观察者的代码就是在存储属性的后面添加一对花括号,在花括号中包好willSet和didSet两个部分。----这两部分都可以省略形参,Swift将会为它们各自提供一个隐式的形参

    7.举个栗子:

    class Person

    {

    //定义存储属性

    var name : String = ""{

    willSet{

    //执行合理性校验,要求用户名必须在6--20位之间

    if(countElements(newValue) < 6) || (countElements(newValue) > 20)

    {

    print("输入的人名不合格")

    }

    else

    {

    print("人名设置符合要求")

    }

    }

    didSet{

    print("人名设置完成,被修改的原名为:\(oldValue)")

    }

    var age : Int = 0{

    willSet{

    if newValue > 100 || newValue < 0

    {

    print("设置的年龄不合格")

    }

    else

    {

    print("年龄设置符合要求")

    }

    }

    didSet{

    print("年龄设置完成,被修改的年龄为:\(oldValue)")

    }

    }

    }

    上面的程序中分别为name、age设置了属性观察者,当程序改变name属性,或者age属性时,属性观察者就会发挥作用。

    相关文章

      网友评论

          本文标题: 每天学一点Swift----面向对象上(六)

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