我正在使用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
}
那么我怎样才能返回正确的类型?
由于
答案 0 :(得分:3)
您可以通过调用Unmanaged
或passRetained
静态函数来创建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?