如何返回非托管<cgcolor>!在斯威夫特

时间:2018-02-27 16:49:30

标签: ios swift cgcolor lottie

我正在使用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
}

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

由于

2 个答案:

答案 0 :(得分:3)

您可以通过调用UnmanagedpassRetained静态函数来创建passUnretained实例:

Unmanaged.passRetained(UIColor.white.cgColor)

但请注意,如果您决定使用takeRetainedValue或使用passRetained()函数,则takeUnretainedValue()将使用passUnretained来处理此变量的未来使用情况}。如果不这样做 - 你会有内存泄漏或可能崩溃。

答案 1 :(得分:0)

您可以使用Unmanaged结构中的takeRetainedValue()方法获取它:

  

获取此非托管引用的值作为托管引用和   消耗它的不平衡。

在您的情况下,实例类型应为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>!


此外,您可能需要检查:

When to use takeUnretainedValue() or takeRetainedValue() to retrieve Unmanaged Objects in Swift?