【问题标题】:Find an integer value in Objective-C enum在 Objective-C 枚举中查找整数值
【发布时间】:2011-05-18 18:29:59
【问题描述】:

是否可以在 Objective-C 中查看 int 值是否在特定的 enum 中?例如,在这个枚举中:

enum  {
  ValidationLoginFailed         = 2000,
  ValidationSessionTokenExpired = 2001,
  ValidationSessionTokenInvalid = 2002,
  ValidationEmailNotFound       = 2003  
}; 
typedef int ValidationStatusCodes;

是否可以查看ValidationStatusCodesenum中是否有任意整数值?

[ValidationStatusCodes contains:intResponseCode]

至少

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode]

【问题讨论】:

    标签: objective-c enums


    【解决方案1】:

    没有比做更简单的方法了

    (ValidationLoginFailed == intResponseCode ||
    ValidationSessionTokenExpired == intResponseCode ||
    ValidationSessionTokenInvalid == intResponseCode ||
    ValidationEmailNotFound == intResponseCode)
    

    一般来说,C 对于做动态的事情或反射类型不是很有帮助,而枚举是 C 的一个特性。

    【讨论】:

      【解决方案2】:

      不适用于enumenum 不是 Objective-C 对象,所以你不能像你正在做的那样向它发送消息。

      也许使用 NSDictionary?

      【讨论】:

        【解决方案3】:

        这个问题有点过时了,但我在软件设计中看到的标准是使用位掩码,其中每个值都是带有位移的离散状态。在某些情况下,您的枚举值可以是其他值的组合。

        enum  {
          ValidationLoginFailed         = 0, //0
          ValidationSessionTokenExpired = 1 << 0, //1
          ValidationSessionTokenInvalid = 1 << 1, //2
          ValidationEmailNotFound       = 1 << 2  //4
        }; 
        typedef int ValidationStatusCodes;
        

        对于您的用例,您可以&amp; 您的结果以及集合中的所有项目:

        int allStates = (ValidationLoginFailed | ValidationSessionTokenExpired | 
           ValidationSessionTokenInvalid | ValidationEmailNotFound); //7
        
        if(val & allStates){
           //some logic here
        }
        

        【讨论】:

        • 请注意,这个答案的关键在于枚举值是互斥的。这不适用于问题中给出的值。
        【解决方案4】:

        好吧,只要这个问题再次出现。有一个不错的开源项目JREnum

        允许执行以下操作:

        JREnumDeclare( ValidationStatusCodes,
          ValidationLoginFailed         = 2000,
          ValidationSessionTokenExpired = 2001,
          ValidationSessionTokenInvalid = 2002,
          ValidationEmailNotFound       = 2003  
        ); 
        

        然后ValidationStatusCodesByValue()返回NSDictionary哪些键对应NSNumbers。所以:

        if ([ValidationStatusCodesByValue() objectForKey:@(intResponseCode)])
            ...
        

        【讨论】:

          【解决方案5】:

          [更新]

          在一些 C++ 帖子中发现了这种方法,虽然不是完全动态的,但可以以最小的麻烦做到这一点:

          向枚举条目添加范围范围:

          enum  {
            ValidationLoginFailed=2000,
            ValidationSessionTokenExpired=2001,
            ValidationSessionTokenInvalid=2002,
            ValidationEmailNotFound=2003
            ValidationSucccesMIN=ValidationLoginFailed,
            ValidationSucccesMAX=ValidationEmailNotFound,
            ValdationValidSuccessCode=9999,
            ValdationInvalidCode=10000
          
          }; 
          typedef int ValidationStatusCodes;
          

          然后是这样的:

          -(ValidationStatusCodes)isReponseCodeValid{
          
          for (int i=ValidationSucccesMIN; i<=ValidationSucccesMAX; i++) {
              if(returnCode==i){
                  return ValdationValidSuccessCode;
              }
          }
          
          return ValdationInvalidCode;
          }
          

          显然,最终应用中的代码远不止这 4 个代码,还会有​​相应的错误代码块。

          【讨论】:

          • 这与简单地检查“returnCode”是否在最小值和最大值之间有什么不同(除了复杂性/性能)?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多