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