我正在尝试运行《 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/