#import #define MY_ERROR_ENUM(_type, _name, _domain) \ enum _name : _type _name; \ enum __attribute__((ns_error_domain(_domain))) _name : _type @class NSString; extern NSString *const TestErrorDomain; typedef MY_ERROR_ENUM(int, TestError, TestErrorDomain) { TENone, TEOne, TETwo, }; extern NSString *const ExhaustiveErrorDomain; typedef MY_ERROR_ENUM(int, ExhaustiveError, ExhaustiveErrorDomain) { EENone, EEOne, EETwo, } __attribute__((enum_extensibility(closed))); extern NSString *const OtherErrorDomain; typedef MY_ERROR_ENUM(int, OtherErrorCode, OtherErrorDomain) { OtherA, OtherB, OtherC, }; extern NSString *TypedefOnlyErrorDomain; typedef enum __attribute__((ns_error_domain(TypedefOnlyErrorDomain))) { TypedefOnlyErrorBadness } TypedefOnlyError; TestError getErr(void); ExhaustiveError getExhaustiveErr(void);