ReflectableEnum
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
- get an enumeration's member for a string (if it exists)
Usage
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
AccountType accountType = REFMemberForString(accountType, @"AccountTypeAdmin"); // 1 (first argument is just for an enum type indication)
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 its type (it's treated as NSInteger
in this case):
NSString *typeString = REFStringForMember((AccountType)AccountTypeStandard);
NSArray *allValues = REFAllValuesForEnumWithMember((AccountType)AccountTypeStandard);
NSInteger mininimum = REFMinForEnumWithMember((AccountType)AccountTypeStandard);
NSInteger maximum = REFMaxForEnumWithMember((AccountType)AccountTypeStandard);
AccountType accountType = REFMemberForString((AccountType)0, @"AccountTypeAdmin"); // 1 (first argument is just for an enum type indication)
The need to cast is a hassle, so ReflectableEnum
will create enum-specific functions for you too:
NSString *typeString = REFStringForMemberInAccountType(AccountTypeStandard);
NSArray *allValues = REFAllValuesInAccountType();
NSInteger mininimum = REFMinInAccountType();
NSInteger maximum = REFMaxInAccountType();
AccountType accountType = REFMemberForStringInAccountType((AccountType)0, @"AccountTypeAdmin");
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)
, REFMaxIn\(enumName)
and REFMemberForStringIn\(enumName)
.
Drawbacks
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
Requirements
- iOS 7 and above
- OS X 10.9 and above
Installation
Install with Carthage:
github "fastred/ReflectableEnum"
or with CocoaPods:
pod "ReflectableEnum"
And then import with: #import <ReflectableEnum/ReflectableEnum.h>
Author
Arkadiusz Holko: