В Swift 3:
я есть собственные цвета в моем коде. Я использую их несколько раз, и я хотел бы, чтобы они были выделены только один раз.
Ситуация / проблемаЕсли мы посмотрим на заголовки UIColor, то увидим следующее:
[...]
// 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
[...]
Я создалextension
UIColor, вот так:
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
UIColor.myColorOne
// B
UIColor.myColorTwo()
К сожалению, я не совсем доволен этим. Действительно, каждый раз, когда я хочу использовать эти цвета: делается новое выделение UIColor.
Что я пробовалApple удалось сделать их цвет кэшированным, видимо. Я бы тоже хотел это сделать. Я пробовал несколько вещей, но ни одна из них не кажется идеальной.
1 - Использование dispatch_once ✗Как видно на странице Swift:свободная функцияdispatch_once
больше не доступен в Swift.
Я получаю следующую ошибку:расширения могут не содержать сохраненные свойства
3 - Создание синглтона ~Это работает (каждый цвет создается только один раз) со следующими
import UIKit
class Colors : UIColor {
// Singleton
static let sharedInstance = Colors()
let myColorOne : UIColor = {
return UIColor.colorWithHexString("AABBCC")
}()
let myColorTwo : UIColor = {
return UIColor.colorWithHexString("DDEEFF")
}()
}
Но это заставляет меня иметь еще один файл и называть мои цвета так
Colors.sharedInstance.myColorOne
Разве нет способа получить цвета, которые я так хочу?UIColor.myColorOne
и они кешируются как Apple?