Como criar vários UIColor em cache

Eu tenho cores personalizadas dentro do meu código. Eu os uso várias vezes e gostaria de alocá-los apenas uma vez.

A situação / problema

Se dermos uma olhada nos cabeçalhos do UIColor, podemos ver o seguinte:

[...]

// Some convenience methods to create colors.  These colors will be as calibrated as possible.
// These colors are cached.

open class var black: UIColor { get } // 0.0 white

open class var darkGray: UIColor { get } // 0.333 white

[...]

Eu criei umextension do UIColor, assim:

import UIKit

extension UIColor {

    class func colorWithHexString(_ hex: String) -> UIColor {

        print("\(#function): \(hex)")

        // some code, then it return a UIColor

        return UIColor(
            red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
            green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
            blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
            alpha: CGFloat(1.0)
        )

    }

    // Option A
    open class var myColorOne : UIColor {
        get {
            return colorWithHexString("AABBCC")
        }
    }

    // Option B
    class func myColorTwo() -> UIColor {
        return colorWithHexString("DDEEFF")
    }
}

A partir daí, posso usar minhas cores facilmente, com uma variável ou uma função.

// A
UIColor.myColorOne

// B
UIColor.myColorTwo()

Infelizmente, não estou totalmente feliz com isso. De fato, toda vez que eu quero usar essas cores: uma nova alocação de UIColor é feita.

O que eu tentei

A Apple conseguiu tornar sua cor em cache aparentemente. Eu também gostaria de fazer isso. Eu tentei várias coisas, mas nenhuma parece ser ideal.

1 - Usando dispatch_once ✗

Como visível na página Swift:a função livredispatch_once não está mais disponível no Swift.

2 - Criando uma constante (let) ✗

Estou tendo o erro a seguir :extensões podem não conter propriedades armazenadas

3 - Criando um singleton ~

Funciona (cada cor é criada apenas uma vez) com os seguintes

import UIKit

class Colors : UIColor {

    // Singleton
    static let sharedInstance = Colors()

    let myColorOne : UIColor = {
        return UIColor.colorWithHexString("AABBCC")
    }()

    let myColorTwo : UIColor = {
        return UIColor.colorWithHexString("DDEEFF")
    }()

}

Mas isso me força a ter mais um arquivo e chamar minhas cores assim

Colors.sharedInstance.myColorOne

Não há como obter as cores que eu quero assimUIColor.myColorOne e colocá-los em cache como a Apple faz?

questionAnswers(4)

yourAnswerToTheQuestion