преобразование строк в перечисляемые типы - PullRequest
0 голосов
/ 27 марта 2009

Кто-нибудь знает, как (или если) вы можете преобразовать строку в перечислимый тип в среде target-c / cocoa / iphone?

Например:

Если у меня есть документ XML с элементом:

<dog breed="GermanShepard">

Я хотел бы иметь возможность прочитать атрибут «breed» в строку NSString, а затем преобразовать его в тип «Dogs», как определено здесь:

typedef enum 
{   
Poodle,
GoldenRetriever,
GermanShepard,
Collie
} Dogs;

Dogs myDog = <string that came from the breed attr in the XML>

Любая помощь приветствуется ...

Кроме того, я просто хочу уточнить, что Я ЕСМЬ могу получить значение attr из XML (это довольно просто). Однако моя проблема заключается в том, что, получив NSString, я не могу преобразовать его в перечислимый тип (т. Е. Тип Dog в примере). Я только включил приведенный выше пример XML, чтобы проиллюстрировать, почему я хотел бы сделать такую ​​вещь.

Ответы [ 5 ]

3 голосов
/ 27 марта 2009

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

2 голосов
/ 27 марта 2009

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

1 голос
/ 12 сентября 2012

Вы должны поместить значения перечисления в NSDictionary:

 NSDictionary *dogs = [NSDictionary dictionaryWithObjectsAndKeys:
                          [NSNumber numberWithInt:Poodle], @"Poodle",
                          [NSNumber numberWithInt:GoldenRetriever],   @"GoldenRetriever",
                          //.....
                          //.....
                          nil];

где-то в классе синтаксического анализа, когда вы собираете значения синтаксического анализа, поместите его в другой NSDictionary

 dictOfParsedData = [NSDictionary dictionaryWithObjectsAndKeys:
                     //.....
                     //.....
                     [dogs valueForKey:[attributeDict objectForKey:@"breed"]], @"breed",
                     //.....
                     nil];

метод, который возвращает элемент типа enum

-(NSInteger)valForGlobalKey:(NSString *)_key andSubKey:(NSString *)_key2{    
    return [[[dictOfParsedData valueForKey:_key] valueForKey:_key2] intValue];
}

где-то в классе, где содержатся собаки

#import "ParsingClass.h" 
@interface ClassOfDogs : NSObject

реализация:

ParsingClass *parsingClassInst = [[ParsingClass alloc] initWithXMLFile:@"Dogs.xml"];    
Dogs myDog = [parsingClassInst valForGlobalKey:@"dog" andSubKey:@"breed"];
1 голос
/ 27 марта 2009

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

0 голосов
/ 27 марта 2009

Если вы используете NSXMLParser, это будет содержаться в атрибутах xml, передаваемых методу делегата parser:didStartElement:namespaceURI:qualifiedName:attributes:. когда он вызывается для элемента dog.

Атрибуты хранятся в NSArray с ключом имени атрибута. В твоем случае "порода". Итак, вы получаете доступ к строке, содержащей имя собаки, используя:

NSString* breedName = [attributesDictionary objectForKey:@"breed"];

Затем у вас есть строка, которую вы можете сравнить (используя сравнения NSString) с именами вашей собаки.

Вы можете получить немного более аккуратный код, сделав свой собственный NSDisctionary из NSNumbers, содержащий ваши значения enum, обозначенные текстовыми именами.

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