当前位置: 首页 > 知识库问答 >
问题:

嵌套参数化闭包参数异常

能旭
2023-03-14

我正在尝试使用UIView执行一组嵌套动画。animateWithDuration然而,不管我使用的闭包返回参数是什么,我似乎都会遇到异常。

无法使用类型为“”的参数列表调用“animateWithDuration”(NSTimeInterval,延迟:NSTimeInterval,选项:UIViewAnimationOptions,animations:()-

这就是冒犯功能

func animateLikeButton(button: UIButton?)
{
    button?.userInteractionEnabled = false;

    let pixelsToScale = 9.0;
    let pixelsToShrink = 4.0;

    let buttonFrame = button?.frame

    // Big
    let scaleOriginX = Double(buttonFrame!.minX) - pixelsToScale / 2.0
    let scaleOriginY = Double(buttonFrame!.minY) - pixelsToScale / 2.0
    let scaleSizeX = Double(buttonFrame!.width) + pixelsToScale
    let scaleSizeY = Double(buttonFrame!.height) + pixelsToScale

    // Small
    let shrinkOriginX = Double(buttonFrame!.minX) + pixelsToScale / 2.0
    let shrinkOriginY = Double(buttonFrame!.minY) + pixelsToScale / 2.0
    let shrinkSizeX = Double(buttonFrame!.width) - pixelsToScale
    let shrinkSizeY = Double(buttonFrame!.height) - pixelsToScale

    UIView.animateWithDuration(NSTimeInterval(0.4), delay:NSTimeInterval(0), options: UIViewAnimationOptions.CurveEaseInOut,
        animations:
        {
            () -> Void in
            button?.frame = CGRect(origin: CGPoint(x: scaleOriginX, y: scaleOriginY), size: CGSize(width: scaleSizeX, height: scaleSizeY))
        },
        completion:
        {
            (finished: Bool) -> Void in
            UIView.animateWithDuration(NSTimeInterval(0.2), delay:NSTimeInterval(0.1), options: UIViewAnimationOptions.CurveEaseInOut,
                animations:
                {
                    () -> Void in
                    button?.frame = CGRect(origin: CGPoint(x: shrinkOriginX, y: shrinkOriginY), size: CGSize(width: shrinkSizeX, height: shrinkSizeY))
                },
                completion:
                {
                    (finished: Bool) -> Void in
                    UIView.animateWithDuration(NSTimeInterval(0.2), delay:NSTimeInterval(0), options: UIViewAnimationOptions.CurveEaseInOut,
                        animations:
                        {
                            () -> Void in
                            button?.frame = buttonFrame!
                        },
                        completion:
                        {
                            (finished: Bool) -> Void in
                            button?.userInteractionEnabled = true
                        }
                    )
                }
            )
        }
    )
}

老实说,我一定尝试过闭包返回参数的所有可能组合(有选项和没有选项),但没有运气。例如:

(_) -> Void in
(finished: Bool) in
(finished: Bool) -> bool in
finished in
_ in

有什么建议让我试试吗?

共有2个答案

杜河
2023-03-14

问题似乎是并非所有命名参数都是必需的,而且大括号和圆括号也会根据嵌套的不同而变化。

UIView.animateWithDuration(NSTimeInterval(0.4), delay: NSTimeInterval(0.0), options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
        button?.frame = CGRect(origin: CGPoint(x: scaleOriginX, y: scaleOriginY), size: CGSize(width: scaleSizeX, height: scaleSizeY))
    }) { (finished) -> Void in
        UIView.animateWithDuration(NSTimeInterval(0.2), delay: NSTimeInterval(0.1), options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
            button?.frame = CGRect(origin: CGPoint(x: shrinkOriginX, y: shrinkOriginY), size: CGSize(width: shrinkSizeX, height: shrinkSizeY))
        }, completion: { (finished) -> Void in
            UIView.animateWithDuration(NSTimeInterval(0.2), delay: NSTimeInterval(0.0), options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in
                button?.frame = buttonFrame!
            }, completion: { (finished) -> Void in
                button?.userInteractionEnabled = true
            })
        })
    }
杭曦
2023-03-14

添加显式的返回应该可以解决问题。下面的代码显示了一个示例:

UIView.animateWithDuration(1.0, delay: 1.0, options: nil, animations:
{
    self.imgIcon?.alpha = 0.0
    return
},
completion:
{
    finished in
    self.imgIcon?.hidden = true
    return
})
 类似资料:
  • 问题内容: UIView需要根据自定义控件的完成处理程序更改警告标签: 最后的动画块显示表格中的错误。 如果我在完成闭包之外的某个地方调用它,那么它将起作用。 问题答案: 问题是闭包隐式返回此表达式的结果: 但闭包本身被声明为returning 。 添加一个显式应该可以解决此问题:

  • 闭包作为参数(Taking closures as arguments) 现在我们知道了闭包是 trait,我们已经知道了如何接受和返回闭包;就像任何其它的 trait! 这也意味着我们也可以选择静态或动态分发。首先,让我们写一个获取可调用结构的函数,调用它,然后返回结果: fn call_with_one<F>(some_closure: F) -> i32 where F : Fn(i

  • 问题内容: 我试图了解Go在创建带有参数的匿名函数与将该函数用作闭包之间的区别。这是区别的一个例子。 带参数: 作为关闭: 我的问题是,第一种形式何时比第二种更好?您是否会为此类事情使用参数?我唯一看到第一种形式有用的是从另一个函数返回a时。 问题答案: 使用闭包与使用函数参数之间的区别在于共享同一变量与获取值的副本有关。请考虑下面的两个示例。 在 Closure中, 所有函数调用都将使用中存储的

  • 在关于参数序列化的OpenAPI文档中,有一个简短的部分是关于如何序列化具有不同样式的查询、路径、标头和cookie参数。这些参数的模式被描述为OpenAPI风格的json模式,它允许对象和数组的无限嵌套。我在文档中没有找到任何关于如何处理这些的内容: https://swagger.io/docs/specification/serialization/ 让我们假设为任何参数提供的JSON模式如

  • 我试图测试一个具有注入的RESTClient的Groovy类。 更新:我认为问题的核心是是false。如何断言两个闭包的相等性 我发现我可以在Spock中捕获闭包,从闭包构建XML,并比较XML对象。什么是一个简明和可读的方法来实现这一点?