如何在Swift中使用UIColor作为枚举类型的RawValue

时间:2018-03-09 10:50:24

标签: swift enums uikit uicolor

我试图使用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#>。但我不知道该怎么做。 如果我要解决第二个错误,如何将原始类型更改为文字?

1 个答案:

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