当前位置: 首页 > 面试题库 >

animateWithDuration:animations:completion:在Swift中

张宣
2023-03-14
问题内容

在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对象的数组。


问题答案:

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

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

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

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

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

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

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

可以这样解决:

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



 类似资料:
  • 问题内容: 我在使代码块在Swift上无法工作时遇到麻烦。这是一个有效的示例(没有完成框): 或没有尾随闭包: 但是一旦我尝试添加完成代码块,它将无法正常工作: 自动完成功能给了我但不确定如何使它起作用。还尝试了结尾闭包,但出现了相同的错误: Swift 3/4的更新: 我不使用结尾封闭符作为完成块,因为我认为它不够清晰,但是如果您喜欢它,那么可以在下面看到Trevor的答案 问题答案: anim

  • 问题内容: 我正在尝试将我的应用程序转换为Swift语言。 我有这行代码: 如何将其转换为Swift? 在Apple的文档中,没有这种方法。 问题答案: iOS 9更新: 如果您的目标是iOS 9+(从Xcode 7 b1开始),则协议中有一个不使用varargs 的新方法: 可以这样使用: 如果您仍然需要支持iOS 8或更早版本,请使用以下原始答案回答此问题。 对于iOS 8和7: 这些方法不适

  • 问题内容: 在目标C中,我可以使用符号导航器标记代码的各个部分。由于这是C预处理程序命令,因此在Swift中不可用。在Swift中有替代方法吗?还是我必须使用丑陋的注释? 问题答案: 您可以使用 也有讨论认为,无论如何,自由使用类扩展可能是更好的做法。由于扩展可以实现协议,因此您可以例如将所有表视图委托方法放入扩展中,并以比其能力更高的语义级别对代码进行分组。

  • 问题内容: 我想在Swift 3.0中使用生成随机字节。这是我在Swift 2.2中所做的 在Swift 3中,我尝试这样做,因为我知道unsafemutablebytes的概念现在有所不同,但是它不允许我返回。如果我评论退货部分,它仍然会说 有谁知道如何解决这一问题? 谢谢 问题答案: 您已经关闭了,但是内部的封闭是从封闭而不是外部函数返回的。因此,仅应在闭包中调用该方法,并将结果传递回去。 对

  • 问题内容: 我已经在Swift中实现了一个使用字典键的Set。我想实现一个addAll(sequence)方法,该方法在Set中的Elements上采用任何序列类型,但是出现一个没有意义的错误。这是我的代码 我在XCode 6.1和6.0.1中遇到此错误。 我想遵循Array的extend方法的语义,但是该类型签名甚至不为我编译。 我做错了什么,还是应该提交雷达? 编辑 :刚刚找到https://

  • 问题内容: 我正在尝试在Swift / Xcode6中使用UITextFieldDelegate,并且正在为应该使用stringByReplacingCharactersInRange的方式而苦苦挣扎。编译器错误为“无法将表达式的类型“字符串”转换为类型“ $ T8”。 Xcode 6 Beta 5的更新:问题是shouldChangeCharactersInRange提供了一个NSRange对象