一尘不染

如何创建几个缓存的UIColor

swift

我的代码中有自定义颜色。我多次使用它们,我只希望分配一次。

状况/问题

如果我们看一下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

[...]

我创建了一个extensionUIColor,就像这样:

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分配。

我尝试过的

苹果设法使它们的颜色明显被缓存。我也想这样做。我已经尝试了几件事,但似乎都没有理想的选择。

1-使用dispatch_once✗

在Swift页面上可见: free功能dispatch_once在Swift中不再可用。

2-创建一个常量(let)✗

我收到以下错误: 扩展名可能不包含存储的属性

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并像苹果一样缓存它们?


阅读 200

收藏
2020-07-07

共1个答案

一尘不染

您可以使用与在Swift中使用dispatch_once单例模型中相同的方法
,即静态常量存储的属性(这些属性是惰性初始化的(且仅初始化一次))。这些可以直接在UIColor扩展中定义:

extension UIColor {
    convenience init(hex: String) {
        // ...          
    }

    static let myColorOne = UIColor(hex:"AABBCC")
    static let myColorTwo = UIColor(hex:"DDEEFF")
}
2020-07-07