2014-01-29 2 views
8

Я конвертирую приложение iOS в 64-разрядное. У меня установлен последний Xcode 5.1 (бета-версия 4).предупреждение о typedef enum при преобразовании приложения в 64-разрядный

Когда я скомпилировал приложение, я получил более 100 предупреждений, и большинство из них довольно легко исправить. Тем не менее, у меня есть предупреждение на следующий код:

+ (CommentResponseStatus)commentReponseStatusCodeWithStatusString:(NSString *)_status 
{ 
    NSArray *commentStatusString = [NSArray arrayWithObjects:@"success", @"needConfirmation", @"stopped", nil]; 

    return [commentStatusString indexOfObject:_status]; 
} 

Где CommentResponseStatus объявлен как:

typedef enum { 
    success, 
    needConfirmation, 
    stopped 
} CommentResponseStatus; 

У меня есть предупреждение «Неявное преобразование теряет целочисленную точность:„NSUInteger“(он же„unsigned long“) на «CommentResponseStatus»

предупреждение на линии return [commentStatusString indexOfObject:_status];

в NSArray у нас есть - (NSUInteger)indexOfObject:(id)anObject;

Я смущен этим предупреждением и пока не знаю, как это исправить. Любая быстрая помощь была бы оценена.

ответ

17

Согласно apple docs о 64-битных изменениях.

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

Чтобы решить эту проблему, создать перечисление с типом ниже синтаксиса.

typedef NS_ENUM(NSUInteger, CommentResponseStatus) { 
    success, 
    needConfirmation, 
    stopped 
}; 

или

typedef enum CommentResponseStatus : NSUInteger { 
    success, 
    needConfirmation, 
    stopped 
} CommentResponseStatus; 
+0

Это сработало! Благодаря! –

+0

Я попробовал 2-е решение, и предупреждение исчезло. Однако я не уверен в первом. Я сделал еще несколько поисков и нашел похожие ответы здесь: http://stackoverflow.com/questions/707512/what-is-a-typedef-enum-in-objective-c –

+0

Я лично рекомендую первый, потому что он имеет только один место для реорганизации смены имени. У последнего есть два, и мне также не нравится стиль именования суффикса по сравнению с префиксом последнего. – Erik

Смежные вопросы