其實安娜迪金森有一個好主意:使用觀察員。
要做到這一點,你會成立專班:
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()
那麼變量someBool的值可以改變從你的項目,像任何地方:
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」聲明更接近您的意圖。
你不想使用while或do-while出於某種原因嗎? – jwlaughton
爲什麼不使用觀察者? –