Создание массива CGColors из массива UIColors или NSColors

Я тестировал CAGradientLayer создавать градиентные цвета для iOS и Mac OS X (Какао). Например, у меня есть следующие строки кода для создания градиентных цветов для iOS.

let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.orangeColor().CGColor,UIColor.redColor().CGColor]
gradient.locations = [0.1,0.9]
self.view.layer.insertSublayer(gradient,atIndex:0)

Теперь, что у меня есть массив цветов (UIColor или же NSColor), в зависимости от платформы разработки. Если я создаю массив, содержащий UIColor (или же NSColor) объекты программно, начиная с

var cArray = [UIColor]() 

или же

var cArray = [NSColor]()

Как я могу создать массив, содержащий CGColors с ними? Я думаю, что эта тема может быть связана. Одна проблема заключается в том, что я не знаю, как объявить и инициализировать массив объектов CGColor.

Спасибо

3 ответа

Решение

Вы могли бы сделать:

extension _ArrayType where Generator.Element == UIColor {
    func CGColors() -> [CGColorRef] {
        var cgColorArray: [CGColorRef] = []

        for color in self {
            cgColorArray.append(color.CGColor)
        }

        return cgColorArray
    }
}

Используйте это так:

let colors: [UIColor] = [UIColor.redColor(), UIColor.orangeColor()]
colors.CGColors()

Повторите для NSColor.

Я также хотел бы дать функцию map немного внимания

    let colors: [UIColor] = [UIColor.redColor(), UIColor.orangeColor()]
    let cgColors: [CGColor] = colors.map({ $0.CGColor })

map применяет замыкание к каждому элементу в массиве и возвращает его.

$0 является первым (и единственным) параметром для замыкания.

Это на самом деле сокращение для:

    let cgColors: [CGColor] = colors.map({ return $0.CGColor })

что является сокращением для:

    let cgColors: [CGColor] = colors.map({
        color: in
        return color.CGColor
    })

что является сокращением для:

    let cgColors: [CGColor] = colors.map({
        (color: UIColor) in
        return color.CGColor
    })

Свифт 5+

Вы можете конвертировать UIColorмассив в CGColorмассив с использованием: colors.map { $0.cgColor }

      // example
let colors: [UIColor] = [.red, .green, .blue]
let cgColors = colors.map { $0.cgColor }
Другие вопросы по тегам