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

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

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

Итак, я попробовал:

self.myProperty = self.myProperty

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

Так как myProperty бывает CGFloat, Я мог бы сделать:

self.myProperty += 0.0

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

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

5 ответов

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

self.myProperty = { self.myProperty }()

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

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

    func myFunc() { ... }
}

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

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

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

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

Я делаю:

      let tmp = myProperty
myProperty = tmp

но ответ Орхана Алиханова лучше. Спасибо !

Другие вопросы по тегам