一尘不染

Swift上的块(animateWithDuration:animations:completion :)

swift

我在使代码块在Swift上无法工作时遇到麻烦。这是一个有效的示例(没有完成框):

UIView.animateWithDuration(0.07) {
    self.someButton.alpha = 1
}

或没有尾随闭包:

UIView.animateWithDuration(0.2, animations: {
    self.someButton.alpha = 1
})

但是一旦我尝试添加完成代码块,它将无法正常工作:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    self.blurBg.hidden = true
})

自动完成功能给了我completion: ((Bool) -> Void)?但不确定如何使它起作用。还尝试了结尾闭包,但出现了相同的错误:

! Could not find an overload for 'animateWithDuration that accepts the supplied arguments

Swift 3/4的更新:

// This is how I do regular animation blocks
UIView.animate(withDuration: 0.2) {
    <#code#>
}

// Or with a completion block
UIView.animate(withDuration: 0.2, animations: {
    <#code#>
}, completion: { _ in
    <#code#>
})

我不使用结尾封闭符作为完成块,因为我认为它不够清晰,但是如果您喜欢它,那么可以在下面看到Trevor的答案


阅读 235

收藏
2020-07-07

共1个答案

一尘不染

animateWithDuration中的完成参数采用一个包含一个布尔参数的块。像在Obj C块中一样,必须迅速指定闭包采用的参数:

UIView.animateWithDuration(0.2, animations: {
    self.blurBg.alpha = 1
}, completion: {
    (value: Bool) in
    self.blurBg.hidden = true
})

这里的重要部分是(value: Bool) in。这告诉编译器,此闭包采用标有“值”的Bool并返回void。

作为参考,如果您想编写一个返回布尔值的闭包,则语法为

{(value: Bool) -> bool in
    //your stuff
}
2020-07-07