lch*_*amp 4 uicolor swift swift-extensions
我的代码中有自定义颜色.我多次使用它们,我想只分配一次.
如果我们看一下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
[...]
Run Code Online (Sandbox Code Playgroud)
我创建了一个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")
}
}
Run Code Online (Sandbox Code Playgroud)
从那里我可以轻松地使用我的颜色,具有变量或功能.
// A
UIColor.myColorOne
// B
UIColor.myColorTwo()
Run Code Online (Sandbox Code Playgroud)
可悲的是,我对此并不满意.实际上,每次我想使用这些颜色时:都会进行新的UIColor分配.
Apple设法让他们的颜色显然被缓存了.我也想自己这样做.我尝试了几件事,但似乎没有一件事是理想的.
在Swift页面上可见:Swift中不再提供免费功能dispatch_once.
我收到以下错误:扩展可能不包含存储的属性
它确实有效(每种颜色只创建一次),具体如下
import UIKit
class Colors : UIColor {
// Singleton
static let sharedInstance = Colors()
let myColorOne : UIColor = {
return UIColor.colorWithHexString("AABBCC")
}()
let myColorTwo : UIColor = {
return UIColor.colorWithHexString("DDEEFF")
}()
}
Run Code Online (Sandbox Code Playgroud)
但它迫使我再增加一个文件并调用我的颜色
Colors.sharedInstance.myColorOne
Run Code Online (Sandbox Code Playgroud)
难道没有办法获得我想要的颜色UIColor.myColorOne并像苹果一样缓存吗?
您可以使用与在Swift中使用dispatch_once单例模型相同的方法
,即静态常量存储属性,它们是懒惰地(并且只有一次)初始化.这些可以直接在UIColor扩展中定义:
extension UIColor {
convenience init(hex: String) {
// ...
}
static let myColorOne = UIColor(hex:"AABBCC")
static let myColorTwo = UIColor(hex:"DDEEFF")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
567 次 |
| 最近记录: |