以下是测试代码:
在第一个中,onComplete函数不是可选的,一切都很好。
然而,在第二个中,发生错误。
有人可以向我解释一下吗?
更新
错误消息是:
答案 0 :(得分:3)
在这种情况下,您有2个选项。如果您知道onComplete块将存在,那么您可以强制解包,如下所示:
func test2(onComplete: blankBlock?) {
UIView.animateWithDuration(1.0, animations: {
completeBlock!()
})
}
如果您不知道onComplete块是否存在,那么您可以测试该值是否存在(推荐方式):
func test2(onComplete: blankBlock?) {
UIView.animateWithDuration(1.0, animations: {
if let validBlock = onComplete {
validBlock()
}
})
}
编辑评论:我明白你的观点。我认为这是因为对onComplete?()
的调用实际上正在返回。因为它是一个可选函数,它将执行或返回nil。但是,animateWithDuration(_:animations :)期望您将为块返回Void,但是在这种情况下您可能会返回nil,这将是不正确的。我之所以认为这是因为将代码更改为以下内容可以解决您的问题:
func test2(onComplete: blankBlock?) {
UIView.animateWithDuration(1.0, animations: {
onComplete?()
return
})
}
答案 1 :(得分:3)
因为,在Swift中,单个表达式闭包implicitly returns the result of expression。
即使您的blankBlock为()->Void
,onComplete?()
也会返回Void?
类型(即Void
或nil
)。
您应该这样做以确保animations
闭包的返回类型为Void
func test2(onComplete: blankBlock?) {
UIView.animateWithDuration(1.0, animations: { () -> Void in
onComplete?()
return // <-- return Void explicitly
})
}