我正在尝试运行《 Build WatchOS:开发和设计》一书中的一些示例代码。以下代码段返回两个错误:

@IBAction func buttonTapped(){
        if animating {
            spinnerImage.stopAnimating()
            animating = false
            animateWithDuration(0.2, animations: updateButtonToStopped())
        } else {
            spinnerImage.startAnimating()
            animating = true
            animateWithDuration(0.2, animations: updateButtonToGoing())
        }

    }


这两个错误都发生在对animateWithDuration()的调用中,并表明存在类型冲突。关于如何解决此问题的任何想法?

最佳答案

匆忙?

而不是像这样调用animateWithDuration

animateWithDuration(0.2, animations: updateButtonToStopped())


您想给它updateButtonToStopped函数作为参数,如下所示:

animateWithDuration(0.2, animations: updateButtonToStopped)


请注意,updateButtonToStopped之后的()已消失。

当然,updateButtonToGoing也是如此:)

为什么?

如果查看animateWithDuration的文档(可以看到here的Swift 3版本),您会看到签名如下所示:

func animate(withDuration duration: TimeInterval, animations: @escaping () -> Void)


animations是这里有趣的部分。

() -> Void


表示animations接受一个函数,该函数必须不包含任何参数并返回Void

在您的情况下,您可以这样称呼它:

animateWithDuration(0.2, animations: updateButtonToStopped())


但是...当您使用updateButtonToStopped()时,实际上是在说:“调用updateButtonToStopped()并将其输出用于animations参数”。正如我们刚刚看到的,这不是编译器所期望的,它期望一个不带任何参数并返回Void的函数。

所以当你说:

animateWithDuration(0.2, animations: updateButtonToStopped)


如果没有括号,则表示您不调用updateButtonToStopped,只需将其作为参数传递给animate

希望这对您有帮助。

关于swift - 生成WatchOS应用程序:开发和设计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39456721/

10-10 10:16