“如果”声明,条件将永远不会被执行

问题描述:

我认为我很好与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

您必须将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

完整的解决方案:

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