Как мне вернуть неуправляемый<CGColor>! в Свифте
Я использую 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
}
Так как же я могу вернуть правильный тип?
Спасибо
2 ответа
Вы можете создать Unmanaged
например, позвонив passRetained
или же passUnretained
статическая функция, как это:
Unmanaged.passRetained(UIColor.white.cgColor)
Но имейте в виду, что для будущего использования этой переменной следует обращаться с takeRetainedValue
если вы решили использовать passRetained()
или с takeUnretainedValue()
функция, если вы будете использовать passUnretained
, Если это не будет сделано - у вас будет утечка памяти или возможный сбой.
Вы можете получить это с помощью 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>!
Кроме того, вы можете проверить: