Как вызвать didSet без изменения значения свойства

#swift #properties #didset

#swift #свойства #didset

Вопрос:

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

Недавно из Objective-C, похоже, не существует setMyProperty() .

Итак, я попытался:

 self.myProperty = self.myProperty
  

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

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

 self.myProperty  = 0.0
  

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

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

Комментарии:

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

Ответ №1:

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

 self.myProperty = { self.myProperty }()
  

Ответ №2:

Вы могли бы сделать:

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

    func myFunc() { ... }
}
  

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

Комментарии:

1. Я думал об этом, но продолжал искать «родную» конструкцию Swift. У меня didSet всего две строки, поэтому я не хотел просто добавлять функцию для этого.

Ответ №3:

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

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

Комментарии:

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

Ответ №4:

Вы можете использовать кортеж 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
  

Комментарии:

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