首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何返回Unmanaged<CGColor>!斯威夫特

如何返回Unmanaged<CGColor>!斯威夫特
EN

Stack Overflow用户
提问于 2018-02-27 16:49:30
回答 2查看 1.2K关注 0票数 4

我正在使用Lottie (动画框架),我试图使用的一个委托是期望我返回一个Unmanaged<CGColor>!

这是一个定义:

代码语言:javascript
复制
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>!'

我已经试过查看他们的文档,但是他们的示例只显示了这样的用法:

代码语言:javascript
复制
let colorBlock = LOTColorBlockCallback { (currentFrame, startKeyFrame, endKeyFrame, interpolatedProgress, startColor, endColor, interpolatedColor) -> Unmanaged<CGColor> in
    return aColor
}

那么我如何返回正确的类型呢?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-27 17:02:30

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

Unmanaged.passRetained(UIColor.white.cgColor)

但是请记住,对于将来使用这个变量,如果您决定使用takeRetainedValue,则应该使用passRetained(),如果要使用passUnretained,则使用takeUnretainedValue()函数。如果不这样做,您就会有内存泄漏或可能崩溃。

票数 4
EN

Stack Overflow用户

发布于 2018-02-27 17:12:11

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

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

因此,在您的示例中,实例类型应该是CGColor,因此:

代码语言:javascript
复制
let cgColor = unmanagedColor.takeRetainedValue()

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

代码语言:javascript
复制
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?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49013861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档