Skip to content

Instantly share code, notes, and snippets.

@asmallteapot
Last active January 23, 2016 01:00
Show Gist options
  • Save asmallteapot/4b0203299ad39d77c8af to your computer and use it in GitHub Desktop.
Save asmallteapot/4b0203299ad39d77c8af to your computer and use it in GitHub Desktop.
Enumerate the values of an NS_ENUM using a block.
typedef NS_ENUM(NSUInteger, ASTGem) {
ASTGemUnknown = 0,
ASTGemGarnet,
ASTGemAmethyst,
ASTGemPearl,
ASTGemRose,
};
static NSString * const ASTGemNames[] = {
[ASTGemUnknown] = nil,
[ASTGemGarnet] = @"Garnet",
[ASTGemAmethyst] = @"Amethyst",
[ASTGemPearl] = @"Pearl",
[ASTGemRose] = @"Rose Quartz",
};
void EnumerateASTGemsWithBlock(void (^enumerationBlock)(ASTGem gem, NSString *name, BOOL *stop)) {
NSUInteger count = sizeof(ASTGemNames) / sizeof(NSString *);
for (NSUInteger idx = 0; idx < count; idx++) {
ASTGem gem = (ASTGem)idx;
NSString *name = ASTGemNames[gem];
BOOL stop = NO;
enumerationBlock(gem, name, &stop);
if (stop) {
break;
}
}
}
static NSString * NSStringFromASTGem(ASTGem gem) {
return ASTGemNames[gem];
}
static ASTGem ASTGemFromNSString(NSString *aString) {
aString = [aString lowercaseString];
__block ASTGem matchingGem = ASTGemUnknown;
EnumerateASTGemsWithBlock(^(ASTGem gem, NSString *name, BOOL *stop) {
if ([aString isEqualToString:name]) {
matchingGem = gem;
*stop = YES;
}
});
return matchingGem;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment