A macro and a set of functions introducing reflection for enumerations in Objective-C.
Features:
- get a string value for an enumeration's member (which is a common problem)
- get all values used in an enumeration (also a prevalent issue)
- get a minimum value in an enumeration
- get a maximum value in an enumeration
Once you have ReflectableEnum added to your project, you just need to replace existing enum definitions, like:
typedef NS_ENUM(NSUInteger, AccountType) {
AccountTypeStandard,
AccountTypeAdmin
};
with:
REFLECTABLE_ENUM(NSInteger,
AccountType,
AccountTypeStandard,
AccountTypeAdmin);
Now you can get a string representing an enumerator and all/minimum/maximum values of an enumeration the enumerator belongs to with:
AccountType accountType = AccountTypeStandard;
NSString *typeString = REFStringForMember(accountType); // @"AccountTypeStandard"
NSArray *allValues = REFAllValuesForEnumWithMember(accountType); // @[@0, @1]
NSInteger mininimum = REFMinForEnumWithMember(accountType); // 0
NSInteger maximum = REFMaxForEnumWithMember(accountType); // 1
In case you pass the enumerator directly to one of these functions, you have to cast it to AccountType
, because the compiler doesn't know the type of the enumerator:
NSString *typeString = REFStringForMember((AccountType)AccountTypeStandard);
NSArray *allValues = REFAllValuesForEnumWithMember((AccountType)AccountTypeStandard);
NSInteger mininimum = REFMinForEnumWithMember((AccountType)AccountTypeStandard);
NSInteger maximum = REFMaxForEnumWithMember((AccountType)AccountTypeStandard);
The need to cast is such a bummer (rdar://20990819), so ReflectableEnum
will create enum-specific functions for you too:
NSString *typeString = REFStringForMemberInAccountType(AccountTypeStandard);
NSArray *allValues = REFAllValuesInAccountType();
NSInteger mininimum = REFMinInAccountType();
NSInteger maximum = REFMaxInAccountType();
As you can see names of these functions depend on the name of the enumeration and follow these patterns: REFStringForMemberIn\(enumName)
, REFAllValuesIn\(enumName)
, REFMinIn\(enumName)
and REFMaxIn\(enumName)
REFStringForMember
andREFStringForMemberIn\(enumName)
don't work with enumerations containing duplicated values, e.g. with self-referencing membersAccountTypeModerator = AccountTypeAdmin
- can't be used for enumerations already defined in frameworks and libraries
- iOS 7 and above
- OS X 10.9 and above
Install with Carthage:
github "fastred/ReflectableEnum"
And then import with: #import <ReflectableEnum/ReflectableEnum.h>
Arkadiusz Holko: