我正在使用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
}那么我如何返回正确的类型呢?
谢谢
发布于 2018-02-27 17:02:30
您可以通过调用Unmanaged或passUnretained静态函数创建passRetained实例,如下所示:
Unmanaged.passRetained(UIColor.white.cgColor)
但是请记住,对于将来使用这个变量,如果您决定使用takeRetainedValue,则应该使用passRetained(),如果要使用passUnretained,则使用takeUnretainedValue()函数。如果不这样做,您就会有内存泄漏或可能崩溃。
发布于 2018-02-27 17:12:11
您可以通过在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>!此外,您可能需要检查:
When to use takeUnretainedValue() or takeRetainedValue() to retrieve Unmanaged Objects in Swift?
https://stackoverflow.com/questions/49013861
复制相似问题