将自定义 UIColor 引入 Swift 项目的最佳方法是什么?
What is the best way to introduce a custom UIColor to a Swift project?
我想到了两种实现方式;在性能、可读性和可维护性方面,您认为其中哪一个更好?
像这样创建 UIColor 的扩展
extension UIColor {
class func myColor() -> UIColor {
return UIColor(red: 128/255, green: 102/255, blue: 0, alpha: 1)
}
}
创建结构:
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)
}
}
我想到了两种实现方式;在性能、可读性和可维护性方面,您认为其中哪一个更好?
像这样创建 UIColor 的扩展
extension UIColor { class func myColor() -> UIColor { return UIColor(red: 128/255, green: 102/255, blue: 0, alpha: 1) } }
创建结构:
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)
}
}