2014-12-19 36 views
0

在斯威夫特,是否if'保持檢查'。 I.E.當變量被改變時它的函數會被調用。我有變數playBegin,在我的程序中途變化。但是,不是直接在更改中實現代碼,而是將變量playBegin設置爲「true」,並在其他位置執行代碼。基本上我的問題是:將if更新並檢查以查看其變量的狀態,還是必須使用其他內容?斯威夫特 - '當'運營商(如果重複?)

要像when在此聲明:

when playBegin { 
    // blahdeblah 
} 

什麼將是when一個很好的替代品? playBegin通常是false,但在程序中途變爲true

+0

你不想使用while或do-while出於某種原因嗎? – jwlaughton

+0

爲什麼不使用觀察者? –

回答

0

如果希望此重複,直到playBegin不再是真實的,你可以這樣做:

while playBegin == true { 
    // blahdeblah 
} 

如果你只是希望它執行一次,如果playBegin是真實的,你可以使用if語句:

if playBegin == true { 
    // blahdeblah 
} 
+0

playBegin通常是false,但它被設置爲true。 –

+0

@WilliamClark我不確定這是怎麼產生的,或者你的意思。你將不得不對你想要的更具體。這個代碼只會運行一次,除非你在更大的循環中使用它。 playBegin的值只有在這行代碼運行時纔有意義。 – drewag

1

drewag的回答是正確的。此外,如果你想代碼總是至少執行一次:

do { 
    // blahdeblah 
} while playBegin == true 
0

其實安娜迪金森有一個好主意:使用觀察員。

要做到這一點,你會成立專班:

class SomeObserverClass 
{ 
    var playBegin:Bool = false 
     { 
     willSet(playBegin) { 
      println("About to set playBegin to \(playBegin)") 
     } 
     didSet { 
      if playBegin == true { 
       // your code when playBegin == true 
       println("playBegin set to \(playBegin)") 
      } 
     } 
    } 
} 

在你的AppDelegate文件,上面(外面)的AppDelegate類實例化這個類:

internal let someObserverClass:SomeObserverClass = SomeObserverClass() 

然後在你的代碼某處如果你這樣說:

someObserverClass.playBegin = someBoolValue 

觀察者類代碼將被執行。

編輯:

我不知道你所說的「複雜的」的意思,但我會盡力。

觀察者屬性是一種特殊的類屬性。例如,如果你有一個類:

class SomeClass 
{ 
    var someBool:Bool = false 

    func someFunction() 
    { 
     ... some code .... 
    } 

    func someOtherFunction 
    { 
     ... some other code .... 
    } 
} 

then someBool是SomeClass的類屬性。

SomeClass的屬性和方法可以從任何其他具有SomeClass實例可見性的類訪問。例如如果你在你的AppDelegate文件中創建SomeClass的實例中(上圖)AppDelegate類外(因此它的可見項目中的任何類)有:

internal let someClass:SomeClass = SomeClass() 

那麼變量some​​Bool的值可以改變從你的項目,像任何地方:

someClass.someBool = true. 

或someFunction可以與執行:

someClass.someFunction() 

OK,這是基本的東西。現在

與觀察者,這是除了當我們聲明的類屬性someBool同樣的事情,我們還定義了一些代碼,我們希望在任何時候執行的財產(變量)被改變。在下面的代碼中,對SomeClass的唯一更改是我添加了這個代碼。

class SomeClass 
{ 
    var someBool:Bool = false 
    { 
     willSet 
     { 
      println("someBool is about to be changed from \(someBool)") 
     } 
     didSet 
     { 
      if someBool == true 
      { 
       // your code when someBool is true 
       println("someBool set to \(someBool)") 
      }else{ 
       println("someBool set to \(someBool)") 
      } 
     } 
    } 

    func someFunction() 
    { 
     ... some code .... 
    } 

    func someOtherFunction 
    { 
     ... some other code .... 
    } 
} 

如果然後在您的項目在其他地方你寫的:

someClass.someBool = true 
someClass.someBool = false 
someClass.someBool = true 

您將獲得:

someBool是即將從假

someBool設置爲true

改變

someBool即將從真實

someBool設置爲false

someBool是即將從假

someBool設置爲true

這種情況的變化而改變是:

class SomeClass 
{ 
    var someBool:Bool = false 
    { 
     willSet(someBool) 
     { 
      println("someBool is about to be changed to \(someBool)") 
     } 
     didSet 
     { 
      if someBool == true 
      { 
       // your code when someBool is true 
       println("someBool set to \(someBool)") 
      }else{ 
       println("someBool set to \(someBool)") 
      } 
     } 
    } 

    func someFunction() 
    { 
     ... some code .... 
    } 

    func someOtherFunction 
    { 
     ... some other code .... 
    } 
} 

如果然後在別的地方你您寫的項目:

someClass.someBool = true 
someClass.someBool = false 
someClass.someBool = true 

您將獲得:

someBool即將被更改爲true

someBool設置爲true

someBool即將被更改爲false

someBool設置爲false

someBool即將更改爲true

someBool設置爲true

這樣做的另一個變化可能是:

class SomeClass 
{ 
    var someBool:Bool = false 
    { 
     willSet(newBool) 
     { 
      println("someBool is about to be changed from \(someBool) to \(newBool)") 
     } 
     didSet 
     { 
      if someBool == true 
      { 
       // your code when someBool is true 
       println("someBool set to \(someBool)") 
      }else{ 
       println("someBool set to \(someBool)") 
      } 
     } 
    } 

    func someFunction() 
    { 
     ... some code .... 
    } 

    func someOtherFunction 
    { 
     ... some other code .... 
    } 
} 

如果然後在您的項目在其他地方你寫的:

someClass.someBool = true 
someClass.someBool = false 
someClass.someBool = true 

你會得到:

someBool是即將從false更改爲真

someBool設置爲true

someBool是即將從真改爲假

someBool設置爲false

someBool即將從false更改爲true

someBool設置爲true

無需如果,do或while語句。在任何時候改變類屬性(變量)時,willSet和didSet代碼都會執行。

您不需要實現willSet和didSet。如果你願意,你可以讓他們中的任何一個離開。

此外,willSet和didSet代碼在類的初始化期間不會執行。

我認爲這比您的「when」聲明更接近您的意圖。

+0

請你爲我的變量playBegin詳細說明你的答案。謝謝 –