Comparing enum cases while ignoring associated values

Interestingly Error / NSError has the superpowers to know enum's discriminator and by abusing it you could get that out:

protocol EnumWithDiscriminator: Error {
    var discriminator: Int { get }
}
extension EnumWithDiscriminator {
    var discriminator: Int {
        (self as NSError).code
    }
}

Test:

struct Client {}
struct Project {}
struct Job { let name: String }
struct Version {}

enum NavNode {
    case client(Client)
    case project(Project)
    case job(Job)
    case version(Version)
}

extension NavNode: EnumWithDiscriminator {}

let a = NavNode.job(Job(name: "a"))
let b = NavNode.job(Job(name: "b"))
let c = NavNode.project(Project())
precondition(a.discriminator == b.discriminator)
precondition(a.discriminator != c.discriminator)
1 Like