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 / problemaSe 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 tenteiA 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.
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?