Can associated values and raw values coexist in Swift enumeration?

后端 未结 5 1786
遇见更好的自我
遇见更好的自我 2020-12-04 19:22

There are examples on Swift book demonstrating associated values and raw values separately, is there a way to define enums with the two features together?

I have tri

5条回答
  •  天涯浪人
    2020-12-04 19:52

    Yes this is possible. An enum may contain both associated values and raw values. (Swift 5 & 4)

    Shorthand notation

    The issue with your code is that you are using the shorthand notation for RawRepresentable and defining associated types.

    Let's look at how to define these separately:

    1) RawRepresentable (shorthand notation):

    enum Barcode: String {
        case UPCA   = "order 1"
        case QRCode = "order 2"
    }
    

    2) Associated types:

    enum Barcode {
        case UPCA(Int, Int, Int)
        case QRCode(String)
    }
    

    Each of these is great, but what if you need both as your code snippet shows.

    Solution

    Define the enum with associated values and then implement conformance to RawRepresentable separately in an extension (i.e. not using shorthand notation).

    Example:

    enum Barcode {
        case UPCA(Int, Int, Int)
        case QRCode(String)
    }
    
    extension Barcode: RawRepresentable {
    
        public typealias RawValue = String
    
        /// Failable Initalizer
        public init?(rawValue: RawValue) {
            switch rawValue {
            case "Order 1":  self = .UPCA(1,1,1) 
            case "Order 2":  self = .QRCode("foo")
            default:
                return nil
            } 
        }
    
        /// Backing raw value
        public var rawValue: RawValue {
            switch self {
            case .UPCA:     return "Order 1"
            case .QRCode:   return "Order 2"
            }
        }
    
    }
    

    Minor Detail

    In this solution, defaults for the associated values, e.g. .UPCA(1,1,1) must be supplied when constructing the enum from the rawValue argument. You can get fancy and use the associated types as part of the backing raw value — which is more powerful, but adds some complexity.

    References

    For more info on the topic see Ole Begemann's excellent write up.

提交回复
热议问题