一尘不染

animateWithDuration:animations:completion:在Swift中

swift

在Objective-C中,我的动画位看起来像这样:

[UIView animateWithDuration:0.5 animations:^{
            [[[_storedCells lastObject] topLayerView] setFrame:CGRectMake(0, 0, swipeableCell.bounds.size.width, swipeableCell.bounds.size.height)];
        } completion:^(BOOL finished) {
            [_storedCells removeLastObject];
 }];

如果我将其翻译成Swift,它应该看起来像这样:

 UIView.animateWithDuration(0.5, animations: {
                    self.storedCells[1].topLayerView.frame = CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height)
                }, completion: { (finished: Bool) in
                    //self.storedCells.removeAtIndex(1)
            })

它在注释行上抱怨。我收到的错误是:Could not find an overload for 'animateWithDuration' that accepts the supplied arguments

我知道完成闭包需要一个布尔值并返回一个空值,但是我应该能够写一些与布尔不相关的东西……对吗?

任何帮助表示赞赏。

编辑 :这是我如何在函数中声明使用的数组:

var storedCells = SwipeableCell[]()

接受SwipeableCell对象的数组。


阅读 236

收藏
2020-07-07

共1个答案

一尘不染

这是一个很好的,棘手的!

问题出在您的完成区块中…

:首先,我要像这样重写它:( 不是最终答案,而是在路上!)

{ _ in self.storedCells.removeAtIndex(1) }

_代替“成品” Bool,以向读者表明其值未在块中使用-您也可以考虑在必要时添加捕获列表,以防止强大的参考周期)

B.您编写的闭包在不应该使用的情况下具有返回类型!多亏了Swift的便捷功能 “从单个表达式闭包中隐式返回”
-您正在返回该表达式的结果,这是给定索引处的元素

(闭包参数的类型completion应该是[[Bool)-> Void))

可以这样解决:

{ _ in self.storedCells.removeAtIndex(1); return () }

2020-07-07