美文网首页
Swift-OOP-Property

Swift-OOP-Property

作者: 守护地中海的花 | 来源:发表于2020-11-19 21:01 被阅读0次

    概念

    存储属性(Stored Property)

    • 类似于成员变量的这个概念
    • 存储在实例的内存中
    • 结构体、类可以定义存储属性
    • 枚举不可定义存储属性
    • 在创建类或结构体的实例时,必须为所有的存储属性设置一个合适的初始值
    • 可以在初始化器里为存储属性设置一个初始值
    • 可以分配一个默认的属性值作为属性定义的一部分

    计算属性(Computed Property)

    • 本质就是方法(函数)
    • 不占用实例的内存
    • 枚举、结构体、类都可以定义计算属性
    • 计算属性只能用var不能let,let代表常量:值是一成不变的。计算属性的值是可能发生变化的(即使是只读计算属性)
    struct Circle {
        //存储属性
        var radius : Double
        //计算属性
        var diameter:Double {
            set {
                radius = newValue / 2
            }
            get {
                radius * 2
            }
        }
    }
    var circle = Circle(radius: 10)
    print(circle.radius)
    print(circle.diameter)
    

    计算属性

    image.png

    set可以没有 get必须有

    set-newValue

    set 传入的新值默认叫做newValue,也可以自定义

    set(newDiameter) {
        radius = newDiameter / 2
    }
    

    get

    只读 赋值报错
    struct Circle1 {
        var radius: Double
        var diameter:Double {
            get {
                radius * 2
            }
        }
    }
    
    var circle1 = Circle1(radius: 10)
    print(circle1.diameter)
    

    简写

    var diameter:Double {
        radius * 2
    }
    

    延迟存储属性

    image.png
    class Car {
        init() {
            print("Car init!")
        }
        func run() {
            print("Car is running!")
        }
    }
    let car = Car()
    car.run()
    
    class Person {
        lazy var car = Car()
        init() {
            print("Person init")
        }
        func goOut() {
            car.run()
        }
    }
    let person = Person()
    person.goOut()
    
    • 使用lazy可以定义一个延迟存储属性,在第一次用到属性的时候才会进行初始化
    • 当结构体包含一个延迟存储属性时,只有var 才能访问延迟存储属性,因为延迟属性初始化时需要改变结构体的内存
    struct Point {
        var x:Int = 0
        var y:Int = 0
        lazy var z = 0
    }
    var point = Point()
    point.z = 0
    

    属性观察器 (Property Observer)

    • 必须初始化哦
    • 可以为非lazy的var存储属性设置属性观察器
    • willSet会传递新值,默认叫newValue
    • didSet会传递旧值,默认叫oldValue
    • 在初始化器中设置属性值不会触发willSet和didSet
    • 在属性定义时设置初始化值也不会willSet和didSet

    结构体里面

    func PropertyObserver() {
        
        struct Circle {
            var radius : Double {
                willSet {
                    print("willSet",newValue)
                }
                didSet {
                    print("didSet",oldValue,radius)
                }
            }
            init() {
                self.radius = 1.0
                print("Circle init!")
            }
        }
        
        var circle = Circle()
        print(circle.radius)
        circle.radius = 2.0
        
        
    }
    

    变量中应用 (需要初始化哦)

    var num1:Int = 10{
        willSet {
            print("willSet",newValue)
        }
        didSet {
            print("didSet oldValue = \(oldValue)")
        }
    }
    num1 = 300
    print(num1)
    

    类型属性

    struct Dog {
        static var count:Int = 0
        init() {
            Dog.count += 1
        }
    }
    
    let dog = Dog()
    print(Dog.count)
    

    相关文章

      网友评论

          本文标题:Swift-OOP-Property

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