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)