Найти целочисленное значение в перечислении Objective C - PullRequest
6 голосов
/ 02 декабря 2010

Возможно ли в Objective-C увидеть, находится ли значение int в определенном enum? Например, в этом перечислении:

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

можно ли увидеть, есть ли произвольное целочисленное значение в ValidationStatusCodes enum?

[ValidationStatusCodes contains:intResponseCode]

или хотя бы

[self intIsInRangeofEnum:ValidationStatusCodes forValue:intResponseCode]

Ответы [ 5 ]

9 голосов
/ 02 декабря 2010

Нет более простого способа, чем просто

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

В общем, C не очень полезен для динамических вещей или размышлений о типах, а перечисления являются функцией C.

3 голосов
/ 02 декабря 2010

Не с enum.enum не является объектом target-C, поэтому вы не можете отправлять ему сообщения, как вы делаете.

Может быть, использовать NSDictionary?

1 голос
/ 21 августа 2013

Этот вопрос немного устарел, но стандарт, который я видел в разработке программного обеспечения, заключается в использовании битовой маски, где каждое из этих значений является дискретным состоянием с битовым сдвигом. В некоторых случаях ваши перечисляемые значения могут быть комбинациями других значений.

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

Для вашего варианта использования вы бы & получили результат со всеми предметами в наборе:

int allStates = (ValidationLoginFailed | ValidationSessionTokenExpired | 
   ValidationSessionTokenInvalid | ValidationEmailNotFound); //7

if(val & allStates){
   //some logic here
}
0 голосов
/ 16 апреля 2013

Ну, пока этот вопрос снова.Есть хороший проект с открытым исходным кодом JREnum

, который позволяет делать следующее:

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

А затем ValidationStatusCodesByValue() возвращает NSDictionary, какие ключи соответствуют NSNumber s.Итак:

if ([ValidationStatusCodesByValue() objectForKey:@(intResponseCode)])
    ...
0 голосов
/ 02 декабря 2010

[ОБНОВЛЕНИЕ]

Обнаружил этот метод в некоторых публикациях на C ++, который, хотя и не полностью динамический, выполняет свою задачу с минимальной суетой:

Добавление диапазонов в записи enum:

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 кода, и будет также блок соответствующих ошибочных кодов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...