![](/img/trans.png)
[英]Swift Unit test- How do I assert that a CGColor is what it's supposed to be?
[英]How do I return an Unmanaged<CGColor>! in Swift
我正在使用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
}
那么我怎樣才能返回正確的類型呢?
謝謝
您可以通過調用passRetained
或passUnretained
靜態函數來創建Unmanaged
實例,如下所示:
Unmanaged.passRetained(UIColor.white.cgColor)
但請記住,對於這個變量的未來使用,應對症處理takeRetainedValue
如果你決定使用passRetained()
或takeUnretainedValue()
函數,如果你會使用passUnretained
。 如果不這樣做 - 你會有內存泄漏或可能崩潰。
您可以通過在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>!
此外,您可能想要檢查:
何時使用takeUnretainedValue()或takeRetainedValue()來檢索Swift中的非托管對象?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.