Property observers willSet and didSet; Property getters and setters

前端 未结 5 1829
孤城傲影
孤城傲影 2020-12-07 17:22

What is the difference between willSet - didSet, and get - set, when working with this inside a property?

From my

5条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-07 18:19

    var variable1 : Int = 0 { //It's a store property
        didSet {
            print (variable1)
        }
        willSet(newValue) {
        ..
        }
    }
    
    var variable2: Int { //It's a Computed Proprties
        get {
            return variable2
        }
        set (newValue){
        }
    }
    

    For detail info of Store property and computed property
    So when you are trying to assign the value into variable at that assigning time come the concept of 'didSet' & 'willSet'. As @Maxim says

    • willSet is called just before the value is stored.
    • didSet is called immediately after the new value is stored.


    Example of 'willSet' & 'didSet' :

    class Number {
       var variable1 : Int = 0 {
            didSet{
                print("didSet called")
            }
            willSet(newValue){
                print("willSet called")
            }
    
        }
    }
    print("we are going to add 3")
    Number().variable1 = 3
    print("we added 3")
    

    //o/p:
    we are going to add 3
    willSet called
    didSet called
    we added 3

    And generally when two property are dependent at that time 'get' & 'set' used. (It's also used in protocol this is different concept.)

    Example of 'get' & 'set':

    class EquilateralTriangle{
        var sideLength: Double = 0.0
        init(sideLength: Double){
            self.sideLength = sideLength
        }
        var perimeter: Double {
            get {
                return 3.0 * sideLength
            }
            set {
                sideLength = newValue / 3.0
            }
        }
    
    }
    
    var triangle = EquilateralTriangle(sideLength: 3.0)
    print(triangle.perimeter) //o/p: 9.0
    triangle.perimeter = 12.0
    print(triangle.sideLength) //o/p: 4.0
    

提交回复
热议问题