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){
}
}
Ответы
Ответ 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