Возможно ли для cgColor.convert дать компоненты меньше 3? (при конвертации в RGB) - PullRequest
0 голосов
/ 24 февраля 2020

Прочитав SO поток о проверке яркости цвета, я нашел этот фрагмент кода с помощью @ jo sh -fuggle:

extension UIColor {

    // Check if the color is light or dark, as defined by the injected lightness threshold.
    // Some people report that 0.7 is best. I suggest to find out for yourself.
    // A nil value is returned if the lightness couldn't be determined.
    func isLight(threshold: Float = 0.5) -> Bool? {
        let originalCGColor = self.cgColor

        // Now we need to convert it to the RGB colorspace. UIColor.white / UIColor.black are greyscale and not RGB.
        // If you don't do this then you will crash when accessing components index 2 below when evaluating greyscale colors.
        let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil)
        guard let components = RGBCGColor?.components else {
            return nil
        }
        guard components.count >= 3 else {
            return nil
        }

        let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000)
        return (brightness > threshold)
    }
}

В коде операторы guard гарантируют, что преобразованный цвет не является nil и имеет три или более компонентов.

Поэтому мой вопрос заключается в том, есть ли какой-либо цвет, который возвращает целую isLight функцию nil

...