【问题标题】:enum Values to NSString (iOS)枚举值到 NSString (iOS)
【发布时间】:2011-09-13 23:26:34
【问题描述】:

我有一个包含多个值的枚举:

枚举 {value1, value2, value3} myValue;

在我的应用程序的某个时刻,我希望检查枚举的哪个值现在处于活动状态。我正在使用 NSLog,但我不清楚如何将枚举的当前值(value1/valu2/valu3/etc...)显示为 NSLog 的 NSString。

有人吗?

【问题讨论】:

标签: ios enums nsstring


【解决方案1】:

这将由编译器验证,因此您不会意外混淆索引。

NSDictionary *stateStrings =
 @{
   @(MCSessionStateNotConnected) : @"MCSessionStateNotConnected",
   @(MCSessionStateConnecting) : @"MCSessionStateConnecting",
   @(MCSessionStateConnected) : @"MCSessionStateConnected",
  };
NSString *stateString = [stateStrings objectForKey:@(state)];

var stateStrings: [MCSessionState: String] = [
    .notConnected : "MCSessionState.notConnected",
    .connecting : "MCSessionState.connecting",
    .connected : "MCSessionState.connected"
]
var stateString = stateStrings[MCSessionState.Connected]

更新:一种更快捷的方法是使用CustomStringConvertible 一致性扩展枚举。此外,通过这种方式,编译器将确保实现对底层枚举的每个新添加(而使用数组则不会),因为switch 语句必须是详尽无遗的。

extension MCSessionState: CustomStringConvertible {
    
    public var description: String {
        switch self {
        case .notConnected:
            return "MCSessionState.notConnected"
        case .connecting:
            return "MCSessionState.connecting"
        case .connected:
            return "MCSessionState.connected"
        @unknown default:
            return "Unknown"
        }
    }
}

// You can use it like this.
var stateString = MCSessionState.connected.description

// Or this.
var stateString = "\(MCSessionState.connected)"

【讨论】:

    【解决方案2】:

    假设要求是枚举语言列表。

    将此添加到 .h 文件中

    typedef NS_ENUM(NSInteger, AvailableLanguage) {
      ENGLISH,
      GERMAN,
      CHINENSE
    };
    

    现在,在 .m 文件中简单地创建一个类似的数组,

    // Try to use the same naming convention throughout. 
    // That is, adding ToString after NS_ENUM name;
    
    NSString* const AvailableLanguageToString[] = {
      [ENGLISH] = @"English",
      [GERMAN]  = @"German",
      [CHINESE] = @"Chinese"
    };
    

    就是这样。现在您可以轻松使用枚举,并使用数组获取枚举字符串。例如,

    - (void) setPreferredLanguage:(AvailableLanguage)language {
      // this will get the NSString* for the language.
      self.preferredLanguage = AvailableLanguageToString[language];
    }
    

    因此,此模式取决于公认的 NS_ENUM 命名约定和伴随的 ToString 数组。尝试完全遵循这个约定,它会变得自然。

    【讨论】:

      【解决方案3】:

      Here is working code https://github.com/ndpiparava/ObjcEnumString

      //1st Approach
      #define enumString(arg) (@""#arg)
      
      //2nd Approach
      
      +(NSString *)secondApproach_convertEnumToString:(StudentProgressReport)status {
      
          char *str = calloc(sizeof(kgood)+1, sizeof(char));
          int  goodsASInteger = NSSwapInt((unsigned int)kgood);
          memcpy(str, (const void*)&goodsASInteger, sizeof(goodsASInteger));
          NSLog(@"%s", str);
          NSString *enumString = [NSString stringWithUTF8String:str];
          free(str);
      
          return enumString;
      }
      
      //Third Approcah to enum to string
      NSString *const kNitin = @"Nitin";
      NSString *const kSara = @"Sara";
      
      
      typedef NS_ENUM(NSUInteger, Name) {
          NameNitin,
          NameSara,
      };
      
      + (NSString *)thirdApproach_convertEnumToString :(Name)weekday {
      
          __strong NSString **pointer = (NSString **)&kNitin;
          pointer +=weekday;
          return *pointer;
      }
      

      【讨论】:

        【解决方案4】:
        1. 一个宏:

          #define stringWithLiteral(literal) @#literal
          
        2. 一个枚举:

          typedef NS_ENUM(NSInteger, EnumType) {
              EnumType0,
              EnumType1,
              EnumType2
          };
          
        3. 一个数组:

          static NSString * const EnumTypeNames[] = {
              stringWithLiteral(EnumType0),
              stringWithLiteral(EnumType1),
              stringWithLiteral(EnumType2)
          };
          
        4. 使用:

          EnumType enumType = ...;
          NSString *enumName = EnumTypeNames[enumType];
          

        ==== 编辑 ====

        将以下代码复制到您的项目中并运行。

        #define stringWithLiteral(literal) @#literal
        
        typedef NS_ENUM(NSInteger, EnumType) {
            EnumType0,
            EnumType1,
            EnumType2
        };
        
        static NSString * const EnumTypeNames[] = {
            stringWithLiteral(EnumType0),
            stringWithLiteral(EnumType1),
            stringWithLiteral(EnumType2)
        };
        
        - (void)test {
            EnumType enumType = EnumType1;
            NSString *enumName = EnumTypeNames[enumType];
            NSLog(@"enumName: %@", enumName);
        }
        

        【讨论】:

        • 别工作!该宏仅在参数上打印文字值。
        • 我试了也没用。所以我为我的问题寻找另一种解决方案。
        【解决方案5】:

        这是一个老问题,但如果您有一个不连续的枚举,请使用字典文字而不是数组:

        typedef enum {
            value1 = 0,
            value2 = 1,
            value3 = 2,
        
            // beyond value3
            value1000 = 1000,
            value1001
        } MyType;
        
        #define NSStringFromMyType( value ) \
        ( \
            @{ \
                @( value1 )    : @"value1", \
                @( value2 )    : @"value2", \
                @( value3 )    : @"value3", \
                @( value1000 ) : @"value1000", \
                @( value1001 ) : @"value1001", \
            } \
            [ @( value ) ] \
        )
        

        【讨论】:

          【解决方案6】:

          如果您需要在用 Objective-C 编写的遗留项目中使用 Swift 代码,下面是一个对 Objective-C 友好的 Enum Struct 示例。

          示例:

          contentType.文件名。 toString()

          返回“文件名”


          contentType.文件名。 原始值

          返回 Int 值,1 (因为它是 struct 上的第二项)

          @objc enum contentType:Int {
          
              //date when content was created [RFC2183]
              case creationDate
          
              //name to be used when creating file    [RFC2183]
              case filename
          
              //whether or not processing is required [RFC3204]
              case handling
          
              //date when content was last modified   [RFC2183]
              case modificationDate
          
              //original field name in form   [RFC7578]
              case name
          
              //Internet media type (and parameters) of the preview output desired from a processor by the author of the MIME content [RFC-ietf-appsawg-text-markdown-12]
              case previewType
          
              //date when content was last read   [RFC2183]
              case readDate
          
              //approximate size of content in octets [RFC2183]
              case size
          
              //type or use of audio content  [RFC2421]
              case voice
          
              func toString() -> String {
                  switch self {
                  case .creationDate:
                      return "creation-date"
                  case .filename:
                      return "filename"
                  case .handling:
                      return "handling"
                  case .modificationDate:
                      return "modification-date"
                  case .name:
                      return "name"
                  case .previewType:
                      return "preview-type"
                  case .readDate:
                          return "read-date"
                  case .size:
                      return "size"
                  case .voice:
                      return "voice"
                  }
              }//eom
          }//eo-enum
          

          【讨论】:

            【解决方案7】:

            我会介绍的是我使用的方式,看起来比以前的答案更好。(我认为)

            为了便于理解,我想用UIImageOrientation来说明。

            typedef enum {
                UIImageOrientationUp = 0,            // default orientation, set to 0 so that it always starts from 0
                UIImageOrientationDown,          // 180 deg rotation
                UIImageOrientationLeft,          // 90 deg CCW
                UIImageOrientationRight,         // 90 deg CW
                UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
                UIImageOrientationDownMirrored,  // horizontal flip
                UIImageOrientationLeftMirrored,  // vertical flip
                UIImageOrientationRightMirrored, // vertical flip
            } UIImageOrientation;
            

            创建一个类似的方法:

            NSString *stringWithUIImageOrientation(UIImageOrientation input) {
                NSArray *arr = @[
                @"UIImageOrientationUp",            // default orientation
                @"UIImageOrientationDown",          // 180 deg rotation
                @"UIImageOrientationLeft",          // 90 deg CCW
                @"UIImageOrientationRight",         // 90 deg CW
                @"UIImageOrientationUpMirrored",    // as above but image mirrored along other axis. horizontal flip
                @"UIImageOrientationDownMirrored",  // horizontal flip
                @"UIImageOrientationLeftMirrored",  // vertical flip
                @"UIImageOrientationRightMirrored", // vertical flip
                ];
                return (NSString *)[arr objectAtIndex:input];
            }
            

            你所要做的就是:

            1. 为你的函数命名。

            2. 复制枚举的内容并将其粘贴在 NSArray *arr = @[] 之间; return (NSString *)[arr objectAtIndex:input];

            3. 添加一些 @ 、 " 和逗号

            4. 利润!!!!

            【讨论】:

            • 易碎的方式......你假设枚举值从 0 开始以 1 为增量
            • 如果不是从 0 开始递增,请使用查找字典,例如 @{@(MyEnumValue1):@"MyEnumValue1"}。这适用于所有情况。
            • 喜欢这种风格,不过给我加了这个,保证数组唯一性 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ ... });
            【解决方案8】:

            这是一个即插即用的解决方案,您可以通过简单复制和粘贴现有定义来扩展它。

            我希望你们都觉得它有用,因为我发现很多其他 StackOverflow 解决方案都很有用。

            - (NSString*) enumItemNameForPrefix:(NSString*)enumPrefix item:(int)enumItem {
            NSString* enumList = nil;
            if ([enumPrefix isEqualToString:@"[Add Your Enum Name Here"]) {
                // Instructions:
                // 1) leave all code as is (it's good reference and won't conflict)
                // 2) add your own enums below as follows:
                //    2.1) duplicate the LAST else block below and add as many enums as you like
                //    2.2) Copy then Paste your list, including carraige returns
                //    2.3) add a back slash at the end of each line to concatenate the broken string
                // 3) your are done.
            }
            else if ([enumPrefix isEqualToString:@"ExampleNonExplicitType"]) {
                enumList = @" \
                ExampleNonExplicitTypeNEItemName1, \
                ExampleNonExplicitTypeNEItemName2, \
                ExampleNonExplicitTypeNEItemName3 \
                ";
            }
            else if ([enumPrefix isEqualToString:@"ExampleExplicitAssignsType"]) {
                enumList = @" \
                ExampleExplicitAssignsTypeEAItemName1 = 1, \
                ExampleExplicitAssignsTypeEAItemName2 = 2, \
                ExampleExplicitAssignsTypeEAItemName3 = 4 \
                ";
            }
            else if ([enumPrefix isEqualToString:@"[Duplicate and Add Your Enum Name Here #1"]) {
                // Instructions:
                // 1) duplicate this else block and add as many enums as you like
                // 2) Paste your list, including carraige returns
                // 3) add a back slash at the end of each line to continue/concatenate the broken string
                enumList = @" \
                [Replace only this line: Paste your Enum Definition List Here] \
                ";
            }
            
            // parse it
            int implicitIndex = 0;
            NSString* itemKey = nil;
            NSString* itemValue = nil;
            NSArray* enumArray = [enumList componentsSeparatedByString:@","];
            NSMutableDictionary* enumDict = [[[NSMutableDictionary alloc] initWithCapacity:enumArray.count] autorelease];
            
            for (NSString* itemPair in enumArray) {
                NSArray* itemPairArray = [itemPair componentsSeparatedByString:@"="];
                itemValue = [[itemPairArray objectAtIndex:0] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                itemKey = [NSString stringWithFormat:@"%d", implicitIndex];
                if (itemPairArray.count > 1)
                    itemKey = [[itemPairArray lastObject] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
                [enumDict setValue:itemValue forKey:itemKey];
                implicitIndex++;
            }
            
            // return value with or without prefix
            NSString* withPrefix = [enumDict valueForKey:[NSString stringWithFormat:@"%d", enumItem]];
            NSString* withoutPrefix = [withPrefix stringByReplacingOccurrencesOfString:enumPrefix withString:@""];
            NSString* outValue = (0 ? withPrefix : withoutPrefix);
            if (0) NSLog(@"enum:%@ item:%d retVal:%@ dict:%@", enumPrefix, enumItem, outValue, enumDict);
            return outValue;
            }
            

            以下是示例声明:

            typedef enum _type1 {
            ExampleNonExplicitTypeNEItemName1, 
            ExampleNonExplicitTypeNEItemName2, 
            ExampleNonExplicitTypeNEItemName3
            } ExampleNonExplicitType;
            
            typedef enum _type2 {
            ExampleExplicitAssignsTypeEAItemName1 = 1, 
            ExampleExplicitAssignsTypeEAItemName2 = 2, 
            ExampleExplicitAssignsTypeEAItemName3 = 4
            } ExampleExplicitAssignsType;
            

            这是一个示例调用:

            NSLog(@"EXAMPLE:  type1:%@  type2:%@ ", [self enumItemNameForPrefix:@"ExampleNonExplicitType" item:ExampleNonExplicitTypeNEItemName2], [self enumItemNameForPrefix:@"ExampleExplicitAssignsType" item:ExampleExplicitAssignsTypeEAItemName3]);
            

            享受吧! ;-)

            【讨论】:

              【解决方案9】:

              如果我可以提供另一种具有类型检查额外好处的解决方案,如果您在转换、可读性和简洁性中缺少枚举值时会发出警告。

              对于您给定的示例:typedef enum { value1, value2, value3 } myValue; 您可以这样做:

              NSString *NSStringFromMyValue(myValue type) {
                  const char* c_str = 0;
              #define PROCESS_VAL(p) case(p): c_str = #p; break;
                  switch(type) {
                          PROCESS_VAL(value1);
                          PROCESS_VAL(value2);
                          PROCESS_VAL(value3);
                  }
              #undef PROCESS_VAL
              
                  return [NSString stringWithCString:c_str encoding:NSASCIIStringEncoding];
              }
              

              作为旁注。像这样声明您的枚举是一种更好的方法:

              typedef NS_ENUM(NSInteger, MyValue) {
                  Value1 = 0,
                  Value2,
                  Value3
              }
              

              这样您就获得了类型安全(在本例中为NSInteger),您可以设置预期的枚举偏移量(= 0)。

              【讨论】:

              • 建议改进:@(#p) 会直接给你一个 NSString。
              【解决方案10】:

              这类似于逐像素发布的“X”宏。 感谢http://en.wikipedia.org/wiki/X_Macro的链接

              在宏中生成的代码可能很棘手且难以调试。 相反,生成一个“正常”代码使用的表。 我发现很多人反对让宏生成代码, 并且可能是所呈现的“X Macros”技术的原因之一 在 wiki 中并未被广泛采用。

              通过生成表格,您仍然只需要编辑一个地方来扩展列表, 并且由于您无法在调试器中“单步执行”表,因此删除了 许多人反对宏中隐藏的多行代码。

              //------------------------------------------------------------------------------
              // enum to string example
              #define FOR_EACH_GENDER(tbd) \
                      tbd(GENDER_MALE) \
                      tbd(GENDER_FEMALE) \
                      tbd(GENDER_INTERSEX) \
              
              #define ONE_GENDER_ENUM(name) name,
              enum
              {
                  FOR_EACH_GENDER(ONE_GENDER_ENUM)
                  MAX_GENDER
              };
              
              #define ONE_GENDER(name) #name,
              static const char *enumGENDER_TO_STRING[] = 
              {
                  FOR_EACH_GENDER(ONE_GENDER)
              };
              
              // access string name with enumGENDER_TO_STRING[value]
              // or, to be safe converting from a untrustworthy caller
              static const char *enumGenderToString(unsigned int value)
              {
                  if (value < MAX_GENDER)
                  {
                      return enumGENDER_TO_STRING[value];
                  }
                  return NULL;
              }
              
              static void printAllGenders(void)
              {
                  for (int ii = 0;  ii < MAX_GENDER;  ii++)
                  {
                      printf("%d) gender %s\n", ii, enumGENDER_TO_STRING[ii]);
                  }
              }
              
              //------------------------------------------------------------------------------
              // you can assign an arbitrary value and/or information to each enum,
              #define FOR_EACH_PERSON(tbd) \
                      tbd(2, PERSON_FRED,     "Fred",     "Weasley", GENDER_MALE,   12) \
                      tbd(4, PERSON_GEORGE,   "George",   "Weasley", GENDER_MALE,   12) \
                      tbd(6, PERSON_HARRY,    "Harry",    "Potter",  GENDER_MALE,   10) \
                      tbd(8, PERSON_HERMIONE, "Hermione", "Granger", GENDER_FEMALE, 10) \
              
              #define ONE_PERSON_ENUM(value, ename, first, last, gender, age) ename = value,
              enum
              {
                  FOR_EACH_PERSON(ONE_PERSON_ENUM)
              };
              
              typedef struct PersonInfoRec
              {
                  int value;
                  const char *ename;
                  const char *first;
                  const char *last;
                  int gender;
                  int age;
              } PersonInfo;
              
              #define ONE_PERSON_INFO(value, ename, first, last, gender, age) \
                                   { ename, #ename, first, last, gender, age },
              static const PersonInfo personInfo[] = 
              {
                  FOR_EACH_PERSON(ONE_PERSON_INFO)
                  { 0, NULL, NULL, NULL, 0, 0 }
              };
              // note: if the enum values are not sequential, you need another way to lookup
              // the information besides personInfo[ENUM_NAME]
              
              static void printAllPersons(void)
              {
                  for (int ii = 0;  ;  ii++)
                  {
                      const PersonInfo *pPI = &personInfo[ii];
                      if (!pPI->ename)
                      {
                          break;
                      }
                      printf("%d) enum %-15s  %8s %-8s %13s %2d\n",
                          pPI->value, pPI->ename, pPI->first, pPI->last,
                          enumGenderToString(pPI->gender), pPI->age);
                  }
              }
              

              【讨论】:

                【解决方案11】:

                在某些情况下,当您需要转换 enum -> NSString 和 NSString -> enum 时,使用 typedef 和 #define(或 const NSStrings)而不是 enum 可能更简单:

                typedef NSString *        ImageType;
                #define ImageTypeJpg      @"JPG"
                #define ImageTypePng      @"PNG"
                #define ImageTypeGif      @"GIF"
                

                然后像使用任何其他 NSString 一样使用“命名”字符串:

                @interface MyData : NSObject
                @property (copy, nonatomic) ImageType imageType;
                @end
                
                @implementation MyData
                - (void)doSomething {
                    //...
                    self.imageType = ImageTypePng;
                    //...
                    if ([self.imageType isEqualToString:ImageTypeJpg]) {
                        //...
                    }
                }
                @end
                

                【讨论】:

                  【解决方案12】:

                  下面的解决方案使用预处理器的字符串化操作符,允许更优雅的解决方案。它可以让您在一个地方定义枚举术语,以更好地抵御拼写错误。

                  首先,按以下方式定义您的枚举。

                  #define ENUM_TABLE \
                  X(ENUM_ONE),    \
                  X(ENUM_TWO)    \
                  
                  #define X(a)    a
                  typedef enum Foo {
                      ENUM_TABLE
                  } MyFooEnum;
                  #undef X
                  
                  #define X(a)    @#a
                  NSString * const enumAsString[] = {
                      ENUM_TABLE
                  };
                  #undef X
                  

                  现在,按以下方式使用它:

                  // Usage
                  MyFooEnum t = ENUM_ONE;
                  NSLog(@"Enum test - t is: %@", enumAsString[t]);
                  
                  t = ENUM_TWO;
                  NSLog(@"Enum test - t is now: %@", enumAsString[t]);
                  

                  哪个输出:

                  2014-10-22 13:36:21.344 FooProg[367:60b] Enum test - t is: ENUM_ONE
                  2014-10-22 13:36:21.344 FooProg[367:60b] Enum test - t is now: ENUM_TWO
                  

                  @pixel 的回答为我指明了正确的方向。

                  【讨论】:

                  • 似乎是一个优雅的解决方案,但这给了我 Mach-O Linker 错误,当我在代码中使用它时,enumAsString 重复符号。
                  • @Mahendra - enumAsString 是全局声明的,所以如果你在另一个头文件中重新声明它,你会得到重复符号错误。修复很简单:为每个文件中的每个变量类型(和每个枚举表)声明 enumAsString 的变体 - 例如retcodeAsStringtagValueAsString
                  【解决方案13】:

                  您可以使用 X 宏 - 它们非常适合。

                  好处 1.实际枚举值与字符串值的关系在一处。 2. 您可以稍后在代码中使用常规 switch 语句。

                  损害 1.初始设置代码有点晦涩,使用了有趣的宏。

                  代码

                  #define X(a, b, c) a b,
                  enum ZZObjectType {
                      ZZOBJECTTYPE_TABLE
                  };
                  typedef NSUInteger TPObjectType;
                  #undef X
                  
                  #define XXOBJECTTYPE_TABLE \
                  X(ZZObjectTypeZero, = 0, "ZZObjectTypeZero") \
                  X(ZZObjectTypeOne, = 1, "ZZObjectTypeOne") \
                  X(ZZObjectTypeTwo, = 2, "ZZObjectTypeTwo") \
                  X(ZZObjectTypeThree, = 3, "ZZObjectTypeThree") \
                  
                  + (NSString*)nameForObjectType:(ZZObjectType)objectType {
                  #define X(a, b, c) @c, [NSNumber numberWithInteger:a],
                      NSDictionary *returnValue = [NSDictionary dictionaryWithObjectsAndKeys:ZZOBJECTTYPE_TABLE nil];
                  #undef X
                      return [returnValue objectForKey:[NSNumber numberWithInteger:objectType]];
                  }
                  
                  + (ZZObjectType)objectTypeForName:(NSString *)objectTypeString {
                  #define X(a, b, c) [NSNumber numberWithInteger:a], @c,
                      NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:ZZOBJECTSOURCE_TABLE nil];
                  #undef X
                      NSUInteger value = [(NSNumber *)[dictionary objectForKey:objectTypeString] intValue];
                      return (ZZObjectType)value;
                  }
                  

                  现在你可以这样做了:

                  NSString *someString = @"ZZObjectTypeTwo"
                  ZZObjectType objectType = [[XXObject objectTypeForName:someString] intValue];
                  switch (objectType) {
                      case ZZObjectTypeZero:
                          //
                          break;
                      case ZZObjectTypeOne:
                          //
                          break;
                      case ZZObjectTypeTwo:
                          //
                          break;
                  }
                  

                  这种模式从 1960 年代就已经存在(不是开玩笑!):http://en.wikipedia.org/wiki/X_Macro

                  【讨论】:

                  • 一个出色的解决方案,具有最小的开销和最大的可读性和可用性!谢谢!宏确实很有趣! )
                  【解决方案14】:

                  这里有答案:a few suggestions on implementation

                  底线是Objective-C 使用的是常规的、旧的C enum,它只是一组美化的整数。

                  给定一个像这样的enum

                  typedef enum { a, b, c } FirstThreeAlpha;
                  

                  你的方法应该是这样的:

                  - (NSString*) convertToString:(FirstThreeAlpha) whichAlpha {
                      NSString *result = nil;
                  
                      switch(whichAlpha) {
                          case a:
                              result = @"a";
                              break;
                          case b:
                              result = @"b";
                              break;
                          case c:
                              result = @"c";
                              break;
                  
                          default:
                              result = @"unknown";
                      }
                  
                      return result;
                  }
                  

                  【讨论】:

                  • 请参阅下面的答案以获得使用 stringize 运算符的更优雅的解决方案。
                  【解决方案15】:

                  我不喜欢将枚举放在堆上,而不提供用于翻译的堆函数。这是我想出的:

                  typedef enum {value1, value2, value3} myValue;
                  #define myValueString(enum) [@[@"value1",@"value2",@"value3"] objectAtIndex:enum]
                  

                  这使枚举和字符串声明保持在一起,以便在需要时轻松更新。

                  现在,在代码中的任何地方,您都可以像这样使用枚举/宏:

                  myValue aVal = value2;
                  NSLog(@"The enum value is '%@'.", myValueString(aVal));
                  
                  outputs: The enum value is 'value2'.
                  

                  为保证元素索引,您始终可以显式声明开始(或所有)枚举值。

                  enum {value1=0, value2=1, value3=2};
                  

                  【讨论】:

                  • 不知道为什么这从未被接受为最佳答案.. 哈哈
                  • 如果枚举无效则崩溃。
                  【解决方案16】:

                  我发现了这个website(下面的例子就是从中得到的),它为这个问题提供了一个优雅的解决方案。原来的帖子来自这个StackOverflow answer

                  // Place this in your .h file, outside the @interface block
                  typedef enum {
                      JPG,
                      PNG,
                      GIF,
                      PVR
                  } kImageType;
                  #define kImageTypeArray @"JPEG", @"PNG", @"GIF", @"PowerVR", nil
                  
                  ...
                  
                  // Place this in the .m file, inside the @implementation block
                  // A method to convert an enum to string
                  -(NSString*) imageTypeEnumToString:(kImageType)enumVal
                  {
                      NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
                      return [imageTypeArray objectAtIndex:enumVal];
                  }
                  
                  // A method to retrieve the int value from the NSArray of NSStrings
                  -(kImageType) imageTypeStringToEnum:(NSString*)strVal
                  {
                      NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
                      NSUInteger n = [imageTypeArray indexOfObject:strVal];
                      if(n < 1) n = JPG;
                      return (kImageType) n;
                  }
                  

                  【讨论】:

                  • 我最终使用了这个+1。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-10-21
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多