我如何 return 一个非托管<CGColor>!在 Swift

How do I return an Unmanaged<CGColor>! in Swift

我正在使用 Lottie(动画框架),我正在尝试使用的其中一位代表希望我 return Unmanaged<CGColor>!

这是定义:

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

如果我只是尝试 return 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
}

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

谢谢

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

Unmanaged.passRetained(UIColor.white.cgColor)

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

可以通过Unmanaged结构中的takeRetainedValue()方法获取:

Gets the value of this unmanaged reference as a managed reference and consumes an unbalanced retain of it.

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


此外,您可能需要检查: