2017-08-27 10 views
-3

私はifステートメントでは良いと思っていましたが、明らかにまだ何か不足しています。ラインtimer.invalidate()では、コンパイラは"if"ステートメント、条件は決して実行されません

を不平を言う限り、私は私の構文が正しいことを伝えることができるよう

を実行されることはありません。

@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に設定して、それが真であるかどうかをチェックします。もちろんそれは当てはまりません。 – Sweeper

+0

この行を削除し、 'var buttonState = false'メソッドを' @IBAction func button(_ 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 
    } 
} 

を、あなたはbuttonStatetrueからfalseとバックまたはにスイッチを継続的にしたいです、あなたはそれをしたいですか何か他(遅延の後に別の値に切り替えるようなもの)?最初のケースでは、メソッドの外にタイマーを宣言し、それを実行させ、無効にしないでください.2番目のケースでは、elseブロック内でタイマー宣言を移動し、repeatをオフにする必要があります。どちらの場合も、おそらくtimer.invalidate()timer.fire()コールを削除する必要があります。

+0

私は、メソッドの内容はまだ意味をなさないことを追加します:) – Sulthan

+0

@Sulthanは 'timer'ハンドリングを参照していますか? – 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 
関連する問題