В 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.

2 - Создание константы (пусть) ✗

Я получаю следующую ошибку:расширения могут не содержать сохраненные свойства

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?

Ответы на вопрос(4)

Ваш ответ на вопрос