Подтвердить что ты не робот

Swift willSet didSet и получить заданные методы в свойстве

В чем разница между 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){
    }
}
4b9b3361

Ответ 1

Когда и почему я должен использовать 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'

Ответ 2

@Максимальный ответ для первой части вашего вопроса.

Как использовать get и set: когда вы хотите вычислить свойство. Это:

var x: Int

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

Вместо

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

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

Рекомендуемое чтение: Properties

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

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

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

Ответ 3

var variable1 : Int = 0 { //It a store property
    didSet {
        print (variable1)
    }
    willSet(newValue) {
    ..
    }
}

var variable2: Int { //It 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". (Он также используется в protocol, это другое понятие.)  

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

Ответ 4

установить:

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

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

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

 var number: Double {
        return .pi*2
    }

willSet didSet:

willSet didSet Наблюдатели свойств

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

  • 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