将自定义UIColor引入Swift项目的最佳方法是什么?

我想过两种类型的实现; 在性能,可读性和可维护性方面,您认为哪一个更好?

  1. 像这样创建UIColor的扩展

    extension UIColor { class func myColor() -> UIColor { return UIColor(red: 128/255, green: 102/255, blue: 0, alpha: 1) } } 
  2. 创建一个结构:

     struct Colors { static let myColor = UIColor(red: 255/255, green: 102/255, blue: 0, alpha: 1) } 

答:扩展,以我的专业意见。

想一想; 在哲学上,你是’扩展’ UIColor提供的颜色范围。 如果您的颜色名称是不同的,并且新function遵循Apple的方法命名协议(即Color ),则扩展UIColor似乎更整洁。 一种或两种新颜色(在我看来)不保证整个专用struct


额外答案: struct (或enum !)哪里适合?

  • 如果您的应用强制替换标准颜色(即自定义’主要’颜色)
  • 如果您的应用程序专门设计为主题/自定义,那么可以使用enum ,作为可用选项的具体列表。
  • 如果你想不出颜色的标准名称( sharkBlueColor ,任何人?)。
  • 如果您的应用专门用于绘图/绘画(在这种情况下,“调色板”构造可能是个好主意)。

……列表还在继续。 当你成熟为Swift开发者时,你必须学会​​辨别和决定自己!

我为此使用枚举

 enum AppColor: UInt32 { case DarkBlue = 0x00437C case LightBlue = 0x7CCEF0 var color: UIColor { return UIColor(hex: rawValue) } } 

这样很容易在xib / storyboard重用相同的颜色,因为我已准备好复制/粘贴的hex值。 并且还需要更少的代码来定义新颜色

为了从hex值创建颜色,我使用了UIColor扩展:

 extension UIColor { public convenience init(hex: UInt32) { let mask = 0x000000FF let r = Int(hex >> 16) & mask let g = Int(hex >> 8) & mask let b = Int(hex) & mask let red = CGFloat(r) / 255 let green = CGFloat(g) / 255 let blue = CGFloat(b) / 255 self.init(red:red, green:green, blue:blue, alpha:1) } }