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

10

我尝试使用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

Do you want to add protocol stubs? Fix it

Raw type 'UIColor' is not expressible by any literal
如果我采用第一种建议,Xcode将在括号内部的开头添加typealias RawValue = <#type#>。但我不确定该怎么做。 如果我要解决第二个错误,我该如何将原始类型更改为文字?

请参见以下链接:https://dev59.com/h1kT5IYBdhLWcg3wELgl - Martin R
@MartinR 谢谢你提供的链接!我已经阅读了链接中提供的所有答案。那里的答案都使用了替代方案,而不是更改颜色枚举集合,这破坏了我正在处理的API的对称性(一组枚举,如SGColorSGShading等)。而且,一些答案对UIColor类进行修改,例如添加扩展,这对我来说听起来并不是很安全。无论如何,感谢你提供的链接! - jackxujh
1个回答

18
经过一番搜索,我找到了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)
        }
    }
}

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