10

我需要在didSet不更改属性值的情况下执行代码。

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

所以我尝试了:

self.myProperty = self.myProperty

导致错误Assigning a property to itself

因为myProperty碰巧是CGFloat,我可以这样做:

self.myProperty += 0.0

它会触发didSet并且不会影响值,但它并没有显示我在这里的意思。

有没有办法以didSet更清晰/直接的方式调用?

4

4 回答 4

27

尝试这个:

self.myProperty = { self.myProperty }()
于 2017-02-14T12:55:04.617 回答
2

你可以这样做:

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

    func myFunc() { ... }
}

myFunc设置时将调用此处myProperty。您也可以myFunc直接呼叫,例如在您需要呼叫的情况下didSet

于 2016-10-05T07:27:11.150 回答
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
于 2016-10-05T10:02:02.480 回答
0

在属性值已更改后调用didSet 。如果要将其恢复为以前的值(因此与不更改属性值具有相同的效果),则需要为其分配“oldValue”属性。请注意oldValue不是您定义的变量,它是预定义的。

var myProperty: CGFloat {
    didSet {
        myProperty = oldValue
    }
}
于 2016-10-05T07:36:24.957 回答