4

我正在使用 Lottie(动画框架),我尝试使用的代表之一希望我返回一个Unmanaged<CGColor>!

这是定义:

color(forFrame currentFrame: CGFloat, startKeyframe: CGFloat, endKeyframe: CGFloat, interpolatedProgress: CGFloat, start startColor: CGColor!, end endColor: CGColor!, currentColor interpolatedColor: CGColor!) -> Unmanaged<CGColor>!

如果我只是尝试返回UIColor.white.cgColor,我会收到一条错误消息

Cannot convert return expression of type 'CGColor' to return type 'Unmanaged<CGColor>!'

我已经尝试过阅读他们的文档,但他们的示例仅显示像这样使用它:

let colorBlock = LOTColorBlockCallback { (currentFrame, startKeyFrame, endKeyFrame, interpolatedProgress, startColor, endColor, interpolatedColor) -> Unmanaged<CGColor> in
    return aColor
}

那么我怎样才能返回正确的类型呢?

谢谢

4

2 回答 2

4

您可以通过调用或静态函数来创建Unmanaged实例,如下所示:passRetainedpassUnretained

Unmanaged.passRetained(UIColor.white.cgColor)

takeRetainedValue但请记住,如果您决定使用此变量,则应处理该变量的未来使用,passRetained()如果takeUnretainedValue()您将使用passUnretained. 如果不这样做 - 你会有内存泄漏或可能的崩溃。

于 2018-02-27T17:02:30.680 回答
1

您可以通过使用结构中的takeRetainedValue()方法来获得它Unmanaged

获取此非托管引用的值作为托管引用并使用它的不平衡保留。

在您的情况下,实例类型应该是CGColor,因此:

let cgColor = unmanagedColor.takeRetainedValue()

应该解决它。请注意,这unmanagedColor是调用您提到的定义的输出:

color(forFrame currentFrame: CGFloat, startKeyframe: CGFloat, endKeyframe: CGFloat, interpolatedProgress: CGFloat, start startColor: CGColor!, end endColor: CGColor!, currentColor interpolatedColor: CGColor!) -> Unmanaged<CGColor>!


此外,您可能需要检查:

何时使用 takeUnretainedValue() 或 takeRetainedValue() 在 Swift 中检索非托管对象?

于 2018-02-27T17:12:11.427 回答