如何在Swift项目中引入自定义UIColor最佳方法?

8

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

  1. Create an extension of UIColor like this

    extension UIColor {
        class func myColor() -> UIColor {
            return UIColor(red: 128/255, green: 102/255, blue: 0, alpha: 1)
        }
    }
    
  2. Create a structure:

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

4
定义“better”...更好的定义是什么? - Eric Aya
我喜欢第二个 :) - onmyway133
第一种方式显然客观上更好。 :D - Danyal Aytekin
2
@EricD 我在考虑性能、可读性和可维护性。我对Swift还很陌生,所以我只是试图不要固守脑海中最先想到的东西。 - javal88
` extension UIColor {open class var farmaOrange: UIColor { return UIColor.init(colorLiteralRed: 0.988, green: 0.337, blue: 0.063, alpha: 1) }} ` - Juan Boero
2个回答

13

回答:在我看来,使用扩展(Extension)更合适。

想一想,哲学上来说,你正在“扩展”UIColor所提供的颜色范围。只要你的颜色名称是独特的,并且新函数遵循苹果的方法命名协议(即<color name>Color),扩展UIColor似乎更整洁。在我看来,一两个新颜色并不值得专门用一个struct来实现。


额外回答: 何时使用struct(或enum!)更合适?

  • 如果您的应用程序需要替换标准颜色(例如自定义“主”颜色)
  • 如果您的应用程序专门设计为具有主题/自定义功能,则可以使用enum作为可用选项的具体列表。
  • 如果您无法想到颜色的标准名称(例如sharkBlueColor)。
  • 如果您的应用程序专门用于绘画/绘图(在这种情况下,“调色板”构造可能是一个好主意)。

...... 列表还可以继续。当您成为一名成熟的Swift开发人员时,您必须学会区分和决策!


1
同意,除非你有理由隐藏它,否则它可以使可发现性更容易——例如具有广泛颜色列表的一系列色彩集——在这种情况下,枚举可能是最好的选择。 - sketchyTech

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

}

1
UIColor(hex:rawValue)?https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIColor_Class/ - Danyal Aytekin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接