Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
659 views
in Technique[技术] by (71.8m points)

swift - Can you extend an enum?

I use enums to store string values like this:

    enum Animals: String {
        case descCat = "I has attitude"
        case descDog = "how can I help"
        case descGator = "I will eat you"
        var s: String {
            get {
                return self.rawValue as String
            }
        }
    }

Then I access them like this:

print("Dogs be like:" + Animals.descDog.s)

My question is can I extend enums like any other struct or object so I don't have to add the var s: String {} property to each enum?

question from:https://stackoverflow.com/questions/33444932/can-you-extend-an-enum

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You want to add a property to all enums whose raw value is a string? This sounds like a case for constrained protocol extensions!

extension RawRepresentable where RawValue == String {
    var description: String {
        return rawValue
    }
}

This works because all enums with a raw value automatically conform to the RawRepresentable protocol, and said protocol has an associated type RawValue that tells you which type the raw value is.

Now your Animals enum will automatically inherit it:

print(Animals.descCat.description) // -> "I has attitude"

Notice that string enums are themselves already CustomStringConvertible, so they already have a description property (that returns the name of the enum case), and yours doesn't override it:

print(Animals.descCat) // -> "descCat"

If you want your description to override the default, just add a declaration of CustomStringConvertible conformance to your enum:

private enum Animals: String, CustomStringConvertible { /*...*/ }
print(Animals.descCat) // -> "I has attitude"

You can also extend this idea to cover other raw value types. For example:

extension RawRepresentable where RawValue: CustomStringConvertible {
    var description: String {
        return rawValue.description
    }
}

Now, you can get automatic descriptions for enums whose raw value is Int or even a custom type (so long as that type has a description of its own).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...