文字列の列を作成して、アルファベット値ではなく序数で並べ替えることができます。例えば:Objective-Cで整列した文字列値を効率的に作成する
"超低" = 0
"非常に低い" = 1
"低" = 2
"「ミディアム= 3
" ハイ= 4
など
JavaやC#では、たとえば列挙型はその序数の値の他に値があります。
Objective-Cで同じ目標を達成する方法はありますか?
ありがとうございます!
文字列の列を作成して、アルファベット値ではなく序数で並べ替えることができます。例えば:Objective-Cで整列した文字列値を効率的に作成する
"超低" = 0
"非常に低い" = 1
"低" = 2
"「ミディアム= 3
" ハイ= 4
など
JavaやC#では、たとえば列挙型はその序数の値の他に値があります。
Objective-Cで同じ目標を達成する方法はありますか?
ありがとうございます!
ただ、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
を返します。
私はそれを直接行う方法を知らない。これは仕事を行うことができますスイッチで作業を除き
@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構造体の配列のように
これは素晴らしいです!それは私が探しているものとほとんど正確です。欠落しているのは、 "Very Low"のような値の文字列を指定し、適切なEnumLikeオブジェクトを取得することによって、これらの "事前定義"要素の1つを作成するオプションを追加することです。私はファイルからデータを読み込んでいるので、これらの文字列を解析して、私が扱うことのできるものにする必要があるため、これが必要です。 –
あなたは、クラスを使用することができます。
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);
辞書のアイデアはとてもよく見えます。私はこのような静的配列を作ることができますし、私が望むように正確に行うことができます - 私はファイルから文字列を読みとり、辞書objectForKeyを呼び出してその値をすぐに知ることができます:ファイルから文字列をキーとして渡します –
"NSString * strMyRating = RatingToString [myRating]; "あなたは 'NSString *'を 'char *'で初期化しています – user102008
@ user102008 - おっと、修正が間違っています – CRD