Xcode 11 / iOS 13
当我使用初始化 2 UIColor 对象时,UIColor(dynamicProvider:)
我不能再使用color1 == color2
了,因为(我认为)它无法比较闭包。
当您在属性中使用颜色时,此问题还会破坏 NSAttributedStrings 的比较。
例子
extension UIColor {
// MARK: - Specify All Colors
convenience init(light: UIColor, dark: UIColor) {
self.init(dynamicProvider: { (traits) in
switch traits.userInterfaceStyle {
case .unspecified, .light: return light
case .dark: return dark
}
})
}
}
UIColor(light: .white, dark: .white) == UIColor(light: .white, dark: .white) // false
当前(非最佳解决方案)
func equals(_ object: Any?) -> Bool {
guard let rhs = object as? UIColor else { return false }
var lhsR: CGFloat = 0
var lhsG: CGFloat = 0
var lhsB: CGFloat = 0
var lhsA: CGFloat = 0
getRed(&lhsR, green: &lhsG, blue: &lhsB, alpha: &lhsA)
var rhsR: CGFloat = 0
var rhsG: CGFloat = 0
var rhsB: CGFloat = 0
var rhsA: CGFloat = 0
rhs.getRed(&rhsR, green: &rhsG, blue: &rhsB, alpha: &rhsA)
return lhsR == rhsR && lhsG == rhsG && lhsB == rhsB && lhsA == rhsA
}
有了这个,你就不能再使用==
了,但是当你想比较颜色时必须显式地调用这个函数。
但是一个更好的解决方案必须通过使用比较颜色的每个表示resolvedColor(with:)
。但这必须由 Apple 实施,这样我们才能继续使用==
该Equatable
协议。