2017-08-27 60 views
-3

我認爲我很好與if語句,但顯然我仍然失去了一些東西。在線路timer.invalidate()編譯器會抱怨「如果」聲明,條件將永遠不會被執行

永遠都不能像據我可以告訴我的語法是否正確執行

@IBAction func button(_ sender: Any) { 

    let timer = Timer.scheduledTimer(timeInterval:0.2 , target: self, selector: #selector(ViewController.imageSwitch) , userInfo: nil, repeats: true) 

    var buttonState = false 

    if buttonState == true { 
     timer.invalidate() 
     buttonState = false 
    } 
    if buttonState == false { 
     timer.fire() 
     buttonState = true 
    } 
} 
+2

你到底想幹什麼?你將'buttonState'設置爲false,然後檢查它是否爲true。當然這不會是真的。 – Sweeper

+0

刪除這行'var buttonState = false'並將其添加到方法'@IBAction func按鈕(_ sender:Any)'之外。 – Amit

+0

您需要將var buttonState = false全局設置爲視圖控制器,否則此條件從不爲真。 – Hitesh

回答

5

您必須將buttonState的聲明移出該方法。然後簡化if條件:

var buttonState = false 

@IBAction func button(_ sender: Any) { 
    let timer = Timer.scheduledTimer(timeInterval:0.2 , target: self, selector: #selector(ViewController.imageSwitch) , userInfo: nil, repeats: true) 

    if buttonState { 
     timer.invalidate() 
     buttonState = false 
    } else { 
     timer.fire() 
     buttonState = true 
    } 
} 

你應該還問自己什麼方法甚至應該做的事情,你想的buttonState不間斷的開關從truefalse和背部你想讓它做東西其他(如延遲後切換到另一個值)?在第一種情況下,您應該在方法外聲明計時器並讓它在那裏運行,從不會使其失效 - 在第二種情況下,您應該在else塊內移動定時器聲明並關閉repeat。在這兩種情況下,您都應該刪除timer.invalidate()timer.fire()調用。

+0

我會補充說,該方法的內容仍然沒有意義:) – Sulthan

+0

@Sulthan你指的是'計時器'處理? – luk2302

+0

準確。它也必須在範圍之外聲明,否則你不能失效,'timer.fire()'只是沒有意義。 – Sulthan

-2

完整的解決方案:

var timerState = false 
var timer = Timer() 

@IBAction func button(_ sender: Any) { 
    if timerState == false { 
     timer.invalidate() 
     timer = Timer.scheduledTimer(timeInterval:0.2 , target: self, selector: #selector(ViewController.imageSwitch) , userInfo: nil, repeats: true) 
     timerState = true 
    } else { 
     timer.invalidate() 
     timerState = false 
相關問題