【问题标题】:How do I return an Unmanaged<CGColor>! in Swift如何返回 Unmanaged<CGColor>!在斯威夫特
【发布时间】:2018-08-07 09:44:59
【问题描述】:

我正在使用 Lottie(动画框架),我尝试使用的代表之一希望我返回 Unmanaged&lt;CGColor&gt;!

这是定义:

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&lt;CGColor&gt;!'

我已经尝试过查看他们的文档,但他们的示例仅显示像这样使用它:

let colorBlock = LOTColorBlockCallback { (currentFrame, startKeyFrame, endKeyFrame, interpolatedProgress, startColor, endColor, interpolatedColor) -> Unmanaged<CGColor> in
    return aColor
}

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

谢谢

【问题讨论】:

标签: ios swift cgcolor lottie


【解决方案1】:

您可以像这样调用passRetainedpassUnretained 静态函数来创建Unmanaged 实例:

Unmanaged.passRetained(UIColor.white.cgColor)

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

【讨论】:

  • 由于 API 是用 Obj-C 编写的,因此该块很可能需要 +0 返回值(因为这是不在 alloc/init/@ 中的方法的默认约定987654331@family),所以Unmanaged.passRetained(UIColor.white.cgColor).autorelease()
【解决方案2】:

你可以在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?

【讨论】:

  • 感谢您的解释,虽然我问的是如何将输出创建为非托管,而不是消耗输出。不过很有价值的信息,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2017-03-24
  • 1970-01-01
  • 2016-02-08
  • 2017-11-13
  • 2015-08-19
  • 2014-09-11
  • 1970-01-01
相关资源
最近更新 更多