2009-03-27 10 views
0

objective-c/cocoa/iphone環境で文字列を列挙型に変換する方法を知っている人はいますか?例えば文字列を列挙型に変換する

:私は要素を持つXML文書がある場合

<dog breed="GermanShepard">

を私はNSStringのに「品種」の属性を読み込み、それを変換できるようにしたいと思いますここで定義されているタイプの「犬」に:

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

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

どのような援助は大歓迎です...

また、XMLからattr値を取得できることを明確にしたい(これはかなり簡単です)。しかし、私の問題は、一度NSStringを取得すると、列挙型(例:Dog型)に変換できないということです。私は、なぜ私がそのようなことをしたいのかを説明する手段として上記のXMLの例だけを含んでいました。

答えて

3

これを行う方法はありません。実行時に文字列を適切な整数値に関連付けるテーブルを作成する必要があります。

+0

私はそれを恐れていました。ああ...ありがとうチャック。 –

0

NSXMLParserを使用する場合、これはparser:didStartElement:namespaceURI:qualifiedName:attributes:デリゲートメソッドに渡されるxml属性内に含まれます。 dog要素が呼び出されたときに呼び出されます。

属性は、属性名をキーとするNSArrayに保持されます。あなたのケースでは "繁殖"。だから、あなたが使用して、犬の名前を含む文字列にアクセス:

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

その後、あなたはあなたの犬の名に(NSStringのの比較を使用して)比較することができ、文字列を持っています。

あなたのenum値を含むNSNumbersの独自のNSDisctionaryをテキストのdognamesでキーすることで、少し手の込んだコードを得ることができます。

+1

、NSDictionaryのから値を検索すると、順番にリスト内の各文字列と比較するよりもはるかに高速である - 特に(可能な犬の名前の)リスト場合長い。辞書検索は基本的に一定の時間内に行われ、各文字列を比較するのはO(n)であり、可能な文字列の数はnです。 – fishinear

+0

あなたはそうです。私はそれで何を考えていたのか分かりません。編集されました。 –

2

コンパイル時に列挙型の値が整数に置き換えられることは間違いないので、文字列との一致を個別にテストするか、またはindexOfObject:を呼び出す列挙型の値の配列を持つ必要があります。

1

同様の質問がhereと聞かれましたが、そこに与えられた一般的なココアベースの回答の多くがあなたのケースで役立つかもしれないと思います。

1

あなたは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]; 

メソッドに入れて

-(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"]; 
関連する問題