Swift属性

作者: dongwenbo | 来源:发表于2016-12-30 16:34 被阅读44次

    Swift属性分为存储属性,计算属性。或者分为实例属性,类属性。计算属性不存储值(像是一个计算方法),枚举没有存储属性

    存储属性

    存在于特定类或结构体实例(或者类和结构体中static修饰)中的一个值,可以是变量,也可以是常量,也可以有默认值,也可以没有
    存储属性在构造完成后必须有值(除了可选类型),常量存储属性只能赋一次值
    Swift中的属性就是属性(命名,类型,内存管理),没有对应的实例变量,没有后端存储

    延迟存储属性

    第一次使用的时候才去计算初始值,使用lazy关键字,而且一定是变量

    class A {
        lazy var a = 1//内部采用可选类型实现
    }
    var a = A()//a.a为nil
    print(a.a)//a.a为1
    

    计算属性

    类,结构体,枚举都可以定义计算属性。计算属性不存储值,提供一个必选getter和一个可选setter,来间接获取变量值,或者设置其他值,计算属性必须使用 var定义

    class A {
        var a: Int {
            get {
                return self.a //死循环
            }
            set {
                self.a = newValue //死循环
            }
        }
    }
    

    newValue为默认参数名,通过set(hhd){},重新命名参数名,hhd为新参数名

    class A {
        var a: Int {
            get {
                return 1
            }
            set(hhd){
                print(hhd)
            }
        }
    }
    
    var a = A()
    a.a = 100
    print(a.a)
      
    
    只读计算属性

    只有getter没有setter

    class A {
        var a: Int {
            return 1//可以省略get
        }
    }
    

    属性观察器

    值变化的时候可以监控,新值和当前值不同也会监控
    延迟属性没有观察器,计算属性自带观察器
    通过重写为继承的属性(计算,存储)添加观察器

    • willSet设置新值前调用
    • didSet设置新值后调用
    class A {
        var a = 2{
            willSet{
                print("willSet newValue \(newValue)")//newValue是个常量
            }
            didSet{
                print("didSet oldValue \(oldValue)")//oldValue也是常量,可以对a再次赋值,这时不会触发观察器
            }
        }
     }
    

    自定义参数名

    class A {
        var a = 2{
            willSet(x){
                print("willSet newValue \(x)")
            }
            didSet(y){
                print("didSet oldValue \(y)")
            }
        }
     }
    

    属性作为in-out参数传入函数,也会触发观察器

    父类的属性在子类的构造器中被赋值时,它在父类中的 willSet
    和 didSet 观察器会被调用,随后才会调用子类的观察器。在父类初始化方法调用之前,子类 给属性赋值时,观察器不会被调用 //不知道这句话到底什么意思”

    全局变量和局部变量

    全局:在函数、方法、闭包和任何类型之外定义
    局部:函数、方法、闭包内定义
    还可以分为 存储型变量 计算型变量 还可以定义属性观察器
    全局的常量变量都是延迟计算,但是不需要lazy修饰
    局部的不延迟

    类型属性

    就是属于类型的属性,所有实例共享
    存储型类型属性可以是常量或变量,计算型类型属性只能是变量
    存储型类型属性必须要有默认值,因为类中没有关于类的构造函数,存储型类型属性是延迟计算,不用 lazy

    类型属性语法

    使用关键字static,计算型类型属性,可以改用class来支持子类对父类的实现进行重写

    获取和设置类型属性的值

    通过类名访问,不能通过实例访问

    相关文章

      网友评论

        本文标题:Swift属性

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