2016-12-22 17 views
1

После создания класса Triangle и используется только для чтения, вычисленного свойство с именем isEquilateral, что если равно как этогоНаблюдателей в быстрых

class Triangle { 
    var a: Int 
    var b: Int 
    var c: Int 
    // initialization stuff 
    var isEquilateral: Bool { 
    return (sideA, sideB) == (sideB, sideC) 
    } 
} 

определит, как я могу добавить наблюдатель, чтобы проверить, если изменения длины, от скажем, другой тип треугольника? Я могу добавить его внутри вычисленного свойства (isEquilateral) или снаружи?

ответ

1

Как сказано в this учебнике:

В вашем случае:

var a: Int { 
    willSet { 
     // First time set 
    } 
    didSet { 
     // Value changed 
    } 
} 
var b: Int ... 
var c: Int ... 

Этот метод работает для меня мало времени

+1

Просьба указать некоторый относительный код для реальной проблемы. Как этот код поможет OP? –

+0

Он будет знать, что делать в следующий раз, этот метод работает для меня несколько раз –

+0

Согласен. 'didSet' поможет –

1

недвижимости наблюдатель является то, что вы ищете:

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

Итак, давайте скажем, вы хотите, чтобы наблюдать изменение a собственности, вы можете реализовать его как:

class Triangle { 
    var a: Int? { 
     willSet { 
      print("the new value is about to be: \(newValue)") 
     } 
     didSet { 
      print("the old value was: \(oldValue)") 
     } 
    } 

    var b: Int? 
    var c: Int? 

    // initialization stuff 

    // ... 
} 

Вызов (трассировки):

let myTriangle = Triangle() 

myTriangle.a = 10 
// this will print: 
// the new value is about to be: Optional(10) 
// the old value was: nil (nil because it's optional...) 

// re-assign a new value: 

myTriangle.a = 20 
// this will print: 
// the new value is about to be: Optional(20) 
// the old value was: Optional(10) 

Как вы можете видеть, это сообщит вам, что значение a было изменено, а также указано, какие старые и новые значения.

Таким образом, реализуя как наблюдатель свойства, вы можете добавить свое пользовательское поведение при изменении значения a; Скажем -для ПРИМЕР- вы хотите, чтобы c должен быть равен новому значению a, если он изменяет:

var a: Int? { 
     willSet { 
      print("the new value is about to be: \(newValue)") 
      b = newValue 
     } 
     didSet { 
      print("the old value was: \(oldValue)") 
     } 
    } 

Или вы ПРИМЕР- свой-хотите вызвать функцию, чтобы сделать что-то при изменении значения из a:

var a: Int? { 
    willSet { 
     print("the new value is about to be: \(newValue)") 
     doSomething() 
    } 
    didSet { 
     print("the old value was: \(oldValue)") 
    } 
} 

private func doSomething() { 
    print("doing something...") 
} 

для получения дополнительной информации, я рекомендую проверить Apple Documentation - раздел "наблюдатели недвижимости".

Надеюсь, это помогло.

+0

Хорошо, я думаю, что сейчас увлекаюсь. У меня есть еще один вопрос. Нужно ли мне вводить забор и didset для каждой переменной (b и c)? – AllocSystems

+0

Нет, нет. Как указано в документации: «У вас есть возможность определить одного или обоих этих наблюдателей на свойстве: willSet вызывается непосредственно перед сохранением значения. didSet вызывается сразу после сохранения нового значения." –

0

Центр уведомлений можно использовать, если вы хотите отслеживать изменения вне класса. Пример:

class Triangle { 
var a: Int { 
    didSet { 
     NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "aValueChanged"), object: self)) 
    } 
} 

func randomFunc() { 
    a = 20 
} 
} 

И поймать эти уведомления:

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.someFunc), name: NSNotification.Name(rawValue: "aValueChanged"), object: nil) 
triangle.something() 

И метод, который получает уведомление:

func someFunc(notification: Notification) { 
    let triangle = notification.object as! Triangle 
    print("a value to \(triangle.a)") 
} 

Это позволит вам проверить изменения за пределами класса.Выход будет a value changed to 20