2016-10-05 122 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

相關問題