使用CGFloat作为参数的函数

时间:2017-02-19 10:08:30

标签: swift3

我正在尝试使用进度条使此功能正常工作:

var progressTimer: Timer?
var time: CGFloat = 0

func setProgress(duration: CGFloat) {
    time += 0.1
    progressFront.progress = time / duration
    if time >= duration {
        progressTimer?.invalidate()
    }
}

func updateProgress() {
    progressTimer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: (#selector(ViewController.setProgress)), userInfo: nil, repeats: true)
}

func pauseUpdateProgress() {
    progressTimer?.invalidate()
}

调用这样的函数,它只是起作用:

setProgress(duration: 20)

如果我像下面那样对它进行硬编码,那么它的工作正常:

func setProgress() {

            time += 0.1
            progressFront.progress = time / 20

            if time >= 20 {
                progressTimer?.invalidate()
            }
        }

我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先,当你有Timer处理程序的参数时,它必须是Timer本身:

func setProgress(_ timer: Timer) {
    ...
}

其次,#selector应指明方法的参数,例如: #selector(setProgress(_:))

答案 1 :(得分:0)

selector的{​​{1}}可以有一个参数,但该参数的类型必须为Timer。你不能以这种方式通过持续时间。

然而,这正是为什么有一个Timer参数,你可以通过:

userInfo

即使这对你来说也不是最好的解决方案,因为在暂停之后,你将不得不再次通过这段时间。

最简单的解决方案是将持续时间保存到属性中。

... userInfo: ["duration": 20.0], repeats: true)