如何在不更改属性值的情况下调用didSet

时间:2016-10-05 07:06:16

标签: swift properties didset

我需要执行didSet中的代码而不更改属性的值。

最近来自Objective-C,似乎没有setMyProperty()

所以我试过了:

self.myProperty = self.myProperty

导致错误Assigning a property to itself

由于myProperty恰好是CGFloat,我可以这样做:

self.myProperty += 0.0

会触发didSet并且不会影响该值,但它不会显示我在此处的意思。

有没有办法以更明确/更直接的方式致电didSet

4 个答案:

答案 0 :(得分:12)

试试这个:

self.myProperty = { self.myProperty }()

答案 1 :(得分:1)

你可以这样做:

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

    func myFunc() { ... }
}

设置myFunc时,系统会调用myProperty。您也可以直接致电myFunc,例如在您需要didSet被调用的情况下。

答案 2 :(得分:0)

在属性值已更改后调用

didSet 。如果您想将其还原为之前的值(因此具有与不更改属性的值相同的效果),您需要为其分配“oldValue”'属性。请注意 oldValue 不是您定义的变量,它是预定义的。

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

答案 3 :(得分: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