/ReflectableEnum

Reflection for enumerations in Objective-C.

Primary LanguageObjective-CMIT LicenseMIT

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

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

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)

Drawbacks

  • REFStringForMember and REFStringForMemberIn\(enumName) don't work with enumerations containing duplicated values, e.g. with self-referencing members AccountTypeModerator = 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"

And then import with: #import <ReflectableEnum/ReflectableEnum.h>

Author

Arkadiusz Holko: