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

What is the best way to introduce a custom UIColor to a Swift project?

我想到了两种实现方式;在性能、可读性和可维护性方面,您认为其中哪一个更好?

  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)
    }
    

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

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


奖励答案: struct(或enum!)在哪里比较合适?

  • 如果您的应用强制替换标准颜色(即自定义 'primary' 种颜色)
  • 如果您的应用是专门为主题化/自定义而设计的,最好有一个 enum,作为可用选项的具体列表。
  • 如果您想不出颜色的标准名称(sharkBlueColor,有人吗?)。
  • 如果您的应用专门针对 drawing/painting(在这种情况下,'palette' 构造可能是个好主意)。

... 不胜枚举。作为一名成熟的 Swift 开发人员,您必须学会辨别并自行决定!

我为此使用枚举

enum AppColor: UInt32 {

    case DarkBlue = 0x00437C
    case LightBlue = 0x7CCEF0

    var color: UIColor {
        return UIColor(hex: rawValue)
    }

}

这样可以很容易地在 xib/storyboard 中重复使用相同的颜色,因为我已经为 copy/paste 准备好了十六进制值。定义新颜色所需的代码也更少

为了从十六进制值创建颜色,我使用了 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)
    }

}