【发布时间】:2017-06-26 17:02:53
【问题描述】:
我的代码中有自定义颜色。我多次使用它们,我希望它们只分配一次。
情况/问题
如果我们查看 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
[...]
我创建了一个 UIColor 的 extension,如下所示:
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 - 创建一个常量 (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 那样获得我想要的颜色并像 Apple 那样缓存它们?
【问题讨论】:
-
@Grimxn,全局变量(甚至懒惰初始化)不是 不好的做法/想法 吗?此外,它不会像其他颜色
UIColor.white那样被调用。 Apple 是如何编写他们的...可能需要在第一次初始化后存储颜色并在以后的调用中获取它(不确定这里的性能,与单例相比)。 -
... ...对不起!
标签: swift uicolor swift-extensions