Как мне вернуть неуправляемый<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>!


Кроме того, вы можете проверить:

Когда использовать takeUnretainedValue() или takeRetainedValue() для извлечения неуправляемых объектов в Swift?

Другие вопросы по тегам