在Swift中,块中的可选功能会引发错误

时间:2014-10-13 03:18:54

标签: ios swift

以下是测试代码:

enter image description here

在第一个中,onComplete函数不是可选的,一切都很好。

然而,在第二个中,发生错误。

有人可以向我解释一下吗?


更新

错误消息是:

enter image description here

2 个答案:

答案 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为()->VoidonComplete?()也会返回Void?类型(即Voidnil)。

您应该这样做以确保animations闭包的返回类型为Void

func test2(onComplete: blankBlock?) {
    UIView.animateWithDuration(1.0, animations: { () -> Void in
        onComplete?()
        return // <-- return Void explicitly
    })
}