2011-05-18 11 views
1

文字列の列を作成して、アルファベット値ではなく序数で並べ替えることができます。例えば:Objective-Cで整列した文字列値を効率的に作成する

"超低" = 0

"非常に低い" = 1

"低" = 2

"「ミディアム= 3

" ハイ= 4

など

JavaやC#では、たとえば列挙型はその序数の値の他に値があります。

Objective-Cで同じ目標を達成する方法はありますか?

ありがとうございます!

答えて

1

ただ、I/Oのための文字列を保持し、すべての計算にenumを使用します。たとえば、あなたの列挙型を定義します。

typedef enum { ExtremelyLow, VeryLow, ... High } Rating; 

あなたは今、あなたはNSArrayを使用するか、単純なC-配列を文字列に列挙リテラルからマップすることなどswitch文の中で、この列挙型を使用することができます。

NSString *RatingToString[] = { @"Extremely Low", @"Very Low", ..., @"High" }; 

Rating myRating; 
NSString *strMyRating = RatingToString[myRating]; 

文字列のバージョンから列挙型への変換が複雑な場合は、同じRatingToString配列を使用して、適切な比較を行うことができます(大文字と小文字は区別されません)。またNSDictionaryを使用することができます。

NSDictionary StringToRating = [NSDictionary dictionaryWithObjectsAndKeys: RatingToString[ExtremelyLow], [NSNumber numberWithInt:ExtremelyLow, ..., nil]; 

今のルックアップは、あなたの文字列に完全一致を行い、NSNumberとしてラップRatingを返します。

+0

辞書のアイデアはとてもよく見えます。私はこのような静的配列を作ることができますし、私が望むように正確に行うことができます - 私はファイルから文字列を読みとり、辞書objectForKeyを呼び出してその値をすぐに知ることができます:ファイルから文字列をキーとして渡します –

+0

"NSString * strMyRating = RatingToString [myRating]; "あなたは 'NSString *'を 'char *'で初期化しています – user102008

+0

@ user102008 - おっと、修正が間違っています – CRD

2

私はそれを直接行う方法を知らない。これは仕事を行うことができますスイッチで作業を除き

@interface EnumLike : NSObject 
{ 
    NSString* title; 
    NSInteger value; 
} 

@property (nonatomic, readonly) NSString* title; 
@property (nonatomic, readonly) NSInteger value; 

// Something like enum 
+ (id)extremelyLow; 
+ (id)veryLow; 
... 
+ (id)high; 
}; 

:しかし、あなたはこのようなのObj-Cのクラスを定義することができます。このようなインスタンスのリストはNSArrayControllerにバインドされ、UIで使用されるため、私は時々、同様の型を使用してユーザーのためにいくつかの "列挙型"を宣言します。 Gobraが提案またはC構造体の配列のように

+0

これは素晴らしいです!それは私が探しているものとほとんど正確です。欠落しているのは、 "Very Low"のような値の文字列を指定し、適切なEnumLikeオブジェクトを取得することによって、これらの "事前定義"要素の1つを作成するオプションを追加することです。私はファイルからデータを読み込んでいるので、これらの文字列を解析して、私が扱うことのできるものにする必要があるため、これが必要です。 –

0

あなたは、クラスを使用することができます。

typedef struct { 
    int      type; 
    NSString     *desc; 
} NXENumToNSString; 



NXENumToNSString kNXGMWidgetTypes[] = { 
    {1, @""}, 
    {2, @"imageGallery"}, 
    {3, @"dotImageGallery"}, 
    {4, @"video"}, 
    {5, @"webView"}, 
    {6, @"image"} 
}; 

NSInteger 
intToStringForArray(NXENumToNSString *buffer, size_t length, NSString *str) 
{ 
    int result = NSIntegerMin; 
    NXENumToNSString *scan, *stop; 
    scan = buffer; 
    stop = scan + length; 
    while (scan < stop) { 
     if ([scan->desc isEqualToString:str]) { 
      result = scan->type; 
      break; 
     } 
     scan++; 
    } 
    return result; 
} 

を、あなたはこのような何かを行うことができます。

size_t l = sizeof(kNXGMWidgetTypes)/sizeof(NXENumToNSString); 
NSInteger result = intToStringForArray(kNXGMWidgetTypes, l, str); 
関連する問題