我试图使用UIColor作为原始值声明枚举类型。这是代码:
enum SGColor: UIColor {
case red = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
case green = #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)
case purple = #colorLiteral(red: 0.5568627715, green: 0.3529411852, blue: 0.9686274529, alpha: 1)
}
但我在第一行遇到两个错误:
'SGColor' declares raw type 'UIColor', but does not conform to RawRepresentable and conformance could not be synthesized
您想添加协议存根吗? 修复
Raw type 'UIColor' is not expressible by any literal
如果我接受了第一个建议,Xcode会在括号内部的开头添加typealias RawValue = <#type#>
。但我不知道该怎么做。
如果我要解决第二个错误,如何将原始类型更改为文字?
答案 0 :(得分:4)
经过一番挖掘后,我发现a post by Ole Begemann提到如何制作自定义颜色枚举集合,在此问题中为SGColor
,符合RawRepresentable协议。
基本上,虽然Xcode很聪明地建议我通过明确地告诉它原始类型来修复问题(如问题中的第一个错误所示),但它仍然不够聪明,无法弄清楚如何为颜色做到这一点文字,或UIColor。
Ole Begemann提到手动一致性将解决这个问题。他详细解释了如何做到这一点。虽然他使用了UIColor
个颜色对象(例如UIColor.red
),但我尝试并测试了使用颜色文字的可行性,因为一般来说,它们更直观,更可定制。
enum SGColor {
case red
case green
case purple
}
extension SGColor: RawRepresentable {
typealias RawValue = UIColor
init?(rawValue: RawValue) {
switch rawValue {
case #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1): self = .red
case #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1): self = .green
case #colorLiteral(red: 0.5568627715, green: 0.3529411852, blue: 0.9686274529, alpha: 1): self = .purple
default: return nil
}
}
var rawValue: RawValue {
switch self {
case .red: return #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
case .green: return #colorLiteral(red: 0.4666666687, green: 0.7647058964, blue: 0.2666666806, alpha: 1)
case .purple: return #colorLiteral(red: 0.5568627715, green: 0.3529411852, blue: 0.9686274529, alpha: 1)
}
}
}