public enum GenericResilientEnum { #if BEFORE case FirstCase case SecondCase case ThirdCase(SomeObject) case ForthCase(T) #else case SecondCase case ForthCase(T) case FirstCase case ThirdCase(SomeObject) #endif } public class SomeObject { public func someNumber() -> Int{ return 7 } } public func createGenericResilientEnum1() -> GenericResilientEnum { return GenericResilientEnum.FirstCase } public func createGenericResilientEnum2() -> GenericResilientEnum { return GenericResilientEnum.SecondCase } public func createGenericResilientEnum3() -> GenericResilientEnum { return GenericResilientEnum.ThirdCase(SomeObject()) } public func createGenericResilientEnum4(_ t: T) -> GenericResilientEnum { return GenericResilientEnum.ForthCase(t) } public func getCase(_ e: GenericResilientEnum) -> Int { var whichCase = 0 switch e { case .FirstCase: whichCase = 1 case .SecondCase: whichCase = 2 case .ThirdCase(_): whichCase = 3 case .ForthCase(_): whichCase = 4 } return whichCase }