swift willSet didset и get set методы в свойстве

в чем разница между willSet -didSet и get - set, при работе с этим внутри свойства?

С моей точки зрения, оба они могут установить значение для свойства. Когда и почему я должен использовать willSet -didSet, и когда get - set?

Я знаю, что для willSet и didSet структура выглядит так:

var variable1 : Int = 0 {
    didSet {
        println (variable1)
    }
    willSet(newValue) {
    ..
    }
}

var variable2: Int {
    get {
        return variable2
    }
    set (newValue){
    }
}

4 ответов


когда и почему я должен использовать willSet / didSet

  • willSet - Это называется просто до значение.
  • didSet сразу после новое значение сохраняется.

рассмотрим ваш пример с выходами:


var variable1 : Int = 0 {
        didSet{
            print("didSet called")
        }
        willSet(newValue){
            print("willSet called")
        }
    }

    print("we are going to add 3")

     variable1 = 3

    print("we added 3")

выход:

we are going to add 3
willSet called
didSet called
we added 3

он работает как pre / post-condition

С другой стороны, вы можете использовать get если вы хотите добавить, например, свойство только для чтения:

var value : Int {
 get {
    return 34
 }
}

print(value)

value = 2 // error: cannot assign to a get-only property 'value'

@ "Максим" для 1-й части вашего вопроса.

когда применять get и set: когда вам нужно вычисляемое свойство. Это:

var x: Int

создает хранится имущество, который автоматически поддерживается переменной (не доступен напрямую). Установка значения для этого свойства преобразуется при установке значения в свойстве и аналогично для получения.

:
var y = {
    get { return x + 5 }
    set { x = newValue - 5}
}

создать вычисляемое свойство, которое не подкрепляется переменной - вместо этого вы должны предоставить реализацию геттера и / или сеттера, как правило, чтение и запись значений из другого свойства и в целом в результате вычисления (следовательно,вычисляемое свойство наименование)

рекомендуемое чтение: свойства

Примечание код:

var variable2: Int {
    get{
        return variable2
    }
    set (newValue){
    }
}

и неправильно потому что get вы попытка вернуть себя, что означает вызов get рекурсивно. И на самом деле компилятор предупредит вас сообщением типа Attempting to access 'variable2' within its own getter.


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){
    }
}

для получения подробной информации о хранить свойство и вычисляемое свойство
Поэтому, когда вы пытаетесь присвоить значение переменной в это время назначения, появляется концепция "didSet" & "willSet". Как говорит @Maxim

  • willSet называется просто до значение.
  • didSet сразу после новое значение на хранении.


пример '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:
мы собираемся добавить 3
willSet под названием
didSet называется
мы добавили 3

и, как правило, когда два свойства зависят в то время " get " & " set " используется. (Он также используется в протокол это разные понятия.)

пример " 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

получить set:

get set are Вычисляемые Свойства, который на самом деле не хранить значение. Вместо этого они предоставляют геттер и дополнительный сеттер для получить и установить другие свойства и значения косвенно

кроме того, вы можете определить вычисляемые свойства только для чтения. Вычисляемое только для чтения свойство всегда возвращает значение и может быть доступно через синтаксис точек, но не может быть установлено в другое значение

пример получить только свойство -

 var number: Double {
        return .pi*2
    }

willSet didSet:

willSet didSet are Наблюдатели За Недвижимостью

наблюдатели свойств наблюдают и реагируют на изменения в свойствах значение. Наблюдатели свойств вызываются каждый раз, когда значение свойства установить, даже если новое значение совпадает с текущим свойством значение.

  • willSet вызывается непосредственно перед сохранением значения.
  • didSet вызывается сразу после сохранения нового значения.

пример

var score: Int = 0 {
    willSet(newScore) {
        print("willSet  score to \(newScore)")
    }
    didSet {
        print("didSet score to \(oldValue) new score is: \(score)")
    }
}
score = 10
//Output 
//willSet  score to 10
//didSet score to 0 new score is: 10

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html