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

时间:2016-03-29 11:18:55

标签: ios swift uicolor

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

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

2 个答案:

答案 0 :(得分:13)

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

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

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

  • 如果您的应用强制替换标准颜色(即自定义) &#39;主&#39;色)
  • 如果您的应用专门设计为主题/自定义,则可能有enum作为可用选项的具体列表。
  • 如果你不能想到颜色的标准名称(sharkBlueColor,有人吗?)。
  • 如果您的应用专门用于绘图/绘画(在这种情况下,&#39;调色板&#39;构造可能是个好主意)。

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

答案 1 :(得分:1)

我使用枚举

enum AppColor: UInt32 {

    case DarkBlue = 0x00437C
    case LightBlue = 0x7CCEF0

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

}

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

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

}