我的代码中有自定义颜色。我多次使用它们,我只希望分配一次。
如果我们看一下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,就像这样:
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分配。
苹果设法使它们的颜色明显被缓存。我也想这样做。我已经尝试了几件事,但似乎都没有理想的选择。
在Swift页面上可见: free功能dispatch_once在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") }() }
但这迫使我再要一个文件,然后像这样称呼我的颜色
Colors.sharedInstance.myColorOne
有没有办法获得我想要的颜色UIColor.myColorOne并像苹果一样缓存它们?
UIColor.myColorOne
您可以使用与在Swift中使用dispatch_once单例模型中相同的方法 ,即静态常量存储的属性(这些属性是惰性初始化的(且仅初始化一次))。这些可以直接在UIColor扩展中定义:
UIColor
extension UIColor { convenience init(hex: String) { // ... } static let myColorOne = UIColor(hex:"AABBCC") static let myColorTwo = UIColor(hex:"DDEEFF") }