2016-10-05 3 views
1

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

Исходя из Objective-C в последнее время, похоже, нет setMyProperty().

Так что я пробовал:

self.myProperty = self.myProperty 

которые приводят к ошибке Assigning a property to itself.

myProperty Потому что случается CGFloat, я мог бы сделать:

self.myProperty += 0.0 

который не вызовет didSet и не влияет на стоимость, но он не показывает, что я имею в виду, чтобы сделать здесь.

Есть ли способ позвонить didSet более понятным/прямым способом?

+2

На мой взгляд 'didSet', как это следует из названия, означает, что свойство было установлено к значение, поэтому попытка выполнить didSet без изменения значения не имеет смысла, и это делает ваш код неясным. –

ответ

1

Вы можете сделать:

struct MyStruct { 
    var myProperty: CGFloat { 
     didSet { 
      myFunc() 
     } 
    } 

    func myFunc() { ... } 
} 

Здесь myFunc будет вызываться, когда myProperty установлен. Вы также можете напрямую позвонить по телефону myFunc, например, в ситуации, в которой вы нуждались didSet.

+0

Я подумал об этом, но продолжал искать «родную» быструю конструкцию. Мой 'didSet' - всего две строки, поэтому я не хотел просто добавлять к ним функцию. –

0

didSet вызывается после того, как значение свойства уже изменено. Если вы хотите вернуть его к предыдущему значению (таким образом, получив тот же эффект, что и не меняя значение свойства), вам нужно назначить его свойство «oldValue». Обратите внимание, что oldValue не является переменной, определенной вами, она поставляется предопределен.

var myProperty: CGFloat { 
    didSet { 
     myProperty = oldValue 
    } 
} 
+0

Я хочу изменить в большинстве случаев, но иногда мне просто нужно, чтобы didSet выполнялся без изменений. –

0

Вы можете использовать кортеж Swift 3

var myProperty : (CGFloat,Bool) = (0.0, false){ 

      didSet { 
       if myProperty.1 { 

       myProperty = (0.0, false) // or (oldValue.0, false) 

        //code..... 
       }else{ 

        // code..... 
       } 
      } 


     } 

    myProperty = (1.0, true) 

    print(myProperty.0) //print 0.0 

    myProperty = (1.0, false) 

    print(myProperty.0) //print 1.0 

    myProperty = (11.0, true) 

    print(myProperty.0) //print 0.0 
+0

Это технически интересно. Это потребует изменения ко всему коду, который использует это свойство; нехорошо. Я отвечу на два из ваших других ответов (дающих вам 20 баллов) в качестве благодарности за усилия и идеи. –

4

Попробуйте это:

self.myProperty = { self.myProperty }() 
+2

Это должно быть принято как правильный ответ! – emiraslan