8

在 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

我知道完成闭包需要一个布尔值并返回一个void,但我应该能够在那里写一些与布尔无关的东西......对吗?

任何帮助表示赞赏。

编辑:这是我在函数中声明我正在使用的数组的方式:

var storedCells = SwipeableCell[]()

一个接受 SwipeableCell 对象的数组。

4

1 回答 1

8

这个不错,有难度!

问题出在您的完成块中...

答:我会先这样重写它:(不是最终答案,但在我们的路上!)

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

_代替“finished” Bool,向读者表明它的值没有在块中使用 - 您也可以考虑在必要时添加捕获列表以防止强引用循环)

B. 你写的闭包有一个不应该的返回类型!这一切都归功于 Swift 的便捷功能“从单个表达式闭包隐式返回” ——您正在返回该表达式的结果,即给定索引处的元素

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

这可以这样解决:

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

于 2014-06-19T00:26:41.303 回答