2016-10-05 88 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() { ... } 
} 

这里myFuncmyProperty设定将被调用。您也可以直接拨打myFunc,例如您需要调用didSet的情况。

+0

我想到了这一点,但继续寻找一个'本土'快速建设。我的'didSet'只有两行,所以我不想为此添加一个函数。 –

0

didSet在属性值已被更改后调用。如果你想将它恢复到之前的值(所以具有与不改变属性值相同的效果),你需要赋值它的'oldValue'属性。请注意,oldValue不是您定义的变量,它来自预定义。

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

我确实需要在大多数情况下进行更改,但有时候我只需要didSet即可执行而不会发生变化。 –

0

可以使用斯威夫特元组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

相关问题