2017-01-26 7 views
2

Я здесь довольно новый и очень новый для Swift. У меня есть вопрос о наблюдателях в сфере недвижимости. Ниже приведен пример кода ниже. Я хочу, чтобы свойство Analysis.hasChanged обновлялось до true, если значение a.value было изменено. Есть ли способ, которым я могу это сделать?Swift: Как наблюдать за изменением свойства класса от другого класса

class Number { 
var value: Double 
init(numberValue: Double) { 
    self.value = NumberValue 
} 
} 

class Analysis { 
var a: Number 
var hasChanged = false 
init(inputNumber: Number) { 
    self.a = inputNumber 
} 
} 

testNumber = Number(numberValue: 4) 
testAnalysis = Analysis(inputNumber: testNumber) 
print(testAnalysis.hasChanged) // will print "false" 
testNumber.value = 10 
print(testAnalysis.hasChanged) // will still print "false", but I want it to print "true" 

В конце концов, я хочу, чтобы пользователь мог получать уведомления, если какие-либо из их анализа использовать номера, которые были изменены таким образом, чтобы они могли обновить результаты анализов, если они выбирают.

Благодарим вас за любую помощь, которую могут мне предложить.

-Logan

+0

KVO работает только в том случае, если класс наследуется от NSObject. –

+2

«Я хочу, чтобы свойство SumTwo.hasChanged обновлялось до true, если значение a.value было изменено». Но нет никакого SumTwo в любом месте вашего кода, так о чем вы говорите? – matt

+0

Упс. Извини за это. Я был в процессе упрощения примера и забыл изменить имя класса в моем первом абзаце. Я исправил это. – Logan

ответ

2

Вы можете использовать встроенные наблюдатели за объектами, предоставляемые Swift. Каждый раз, когда вы устанавливаете новое значение, будет вызываться didSet. Вам просто нужно прикрепить крышку, обернув желаемое поведение, к классу Number

class Number { 

    var valueDidChangeClosure: (()->())? 
    var value: Double { 
     didSet { 

      //won't call the valueDidChangeClosure 
      //if the value was changed from 10 to 10 for example.. 

      if oldValue != value { 
       valueDidChangeClosure?() 
      } 
     } 
    } 
    init(numberValue: Double) { 
     self.value = numberValue 
    } 
} 

class Analysis { 
    var a: Number 
    var hasChanged = false 
    init(inputNumber: Number) { 
     self.a = inputNumber 
     self.a.valueDidChangeClosure = { 
      self.hasChanged = true 
     } 
    } 
} 

let testNumber = Number(numberValue: 4) 
let testAnalysis = Analysis(inputNumber: testNumber) 

print(testAnalysis.hasChanged) // will print "false" 
testNumber.value = 10 
print(testAnalysis.hasChanged) // will print "true" 
+0

Это потрясающе. Так просто! Мне нужно изучить это, чтобы посмотреть, что здесь происходит, но оно полностью работает, и это все, что мне нужно! Спасибо, Денислава! – Logan

0

Я хотел бы сделать что-то вроде этого, я заранее извиняюсь, если у меня есть некоторый синтаксис неправильно (я обычно использую C/C++, думать об этом как более psudo кода, так как вы должны были бы иметь способ копирования классов чисел и т. д.).

class Number { 
var value: Double 
init(numberValue: Double) { 
    self.value = NumberValue 
} 
} 

class Analysis { 
var a: Number 
var _a: Number 
bool hasChanged() { 
    if (a != _a) { 
     _a = a 
     return true; 
    } 
    return false; 
} 
init(inputNumber: Number) { 
    self.a = inputNumber 
    self._a = self.a 
} 
} 

testNumber = Number(numberValue: 4) 
testAnalysis = Analysis(inputNumber: testNumber) 
print(testAnalysis.hasChanged()) // will print "false" 
testNumber.value = 10 
print(testAnalysis.hasChanged()) // will still print "false", but I want it to print "true" 

В конце концов, я хочу, чтобы пользователь мог получать уведомления, если какие-либо из их анализа использовать номера, которые были изменены таким образом, чтобы они могли обновить результаты анализов, если они выбирают.

Я не знаю, действительно ли это относится к этому вопросу, я основывал свой ответ на коде, который вы предоставили. Таким образом, может быть дополнительная функциональность, если вы хотите, чтобы был какой-то метод запуска (вместо вызова .hasChanged()).

Смежные вопросы