NSString などの objc オブジェクトを列挙する方法を探しています。enum の新しい方法を提供する Xcode4+ のバージョンに新しい機能があったことを覚えていますが、明確ではありません。それ知ってる人いる?
質問する
49816 次
7 に答える
35
OK、私は自分自身に答えました。私は間違いを犯すと思います。
これは、上で述べた新機能です。
typedef enum Language : NSUInteger{
ObjectiveC,
Java,
Ruby,
Python,
Erlang
}Language;
これは Xcode 4.4 の enum の新しい構文にすぎませんが、「NSUInteger」を「NSString」に交換できると考えるのは愚かなことです。
だからここに私が見つけた方法があります:
http://longweekendmobile.com/2010/12/01/not-so-nasty-enums-in-objective-c/
// Place this in your .h file, outside the @interface block
typedef enum {
JPG,
PNG,
GIF,
PVR
} kImageType;
#define kImageTypeArray @"JPEG", @"PNG", @"GIF", @"PowerVR", nil
...
// Place this in the .m file, inside the @implementation block
// A method to convert an enum to string
-(NSString*) imageTypeEnumToString:(kImageType)enumVal
{
NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
return [imageTypeArray objectAtIndex:enumVal];
}
// A method to retrieve the int value from the NSArray of NSStrings
-(kImageType) imageTypeStringToEnum:(NSString*)strVal
{
NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
NSUInteger n = [imageTypeArray indexOfObject:strVal];
if(n < 1) n = JPG;
return (kImageType) n;
}
ご参考までに。2 番目のサンプル コードの元の作成者は、列挙型処理のカテゴリを作成しました。独自の NSArray クラス定義に追加するためのものです。
@interface NSArray (EnumExtensions)
- (NSString*) stringWithEnum: (NSUInteger) enumVal;
- (NSUInteger) enumFromString: (NSString*) strVal default: (NSUInteger) def;
- (NSUInteger) enumFromString: (NSString*) strVal;
@end
@implementation NSArray (EnumExtensions)
- (NSString*) stringWithEnum: (NSUInteger) enumVal
{
return [self objectAtIndex:enumVal];
}
- (NSUInteger) enumFromString: (NSString*) strVal default: (NSUInteger) def
{
NSUInteger n = [self indexOfObject:strVal];
if(n == NSNotFound) n = def;
return n;
}
- (NSUInteger) enumFromString: (NSString*) strVal
{
return [self enumFromString:strVal default:0];
}
@end
于 2012-11-01T15:43:52.540 に答える
28
構造体を使用する別の方法:
extern const struct AMPlayerStateReadable
{
__unsafe_unretained NSString *ready;
__unsafe_unretained NSString *completed;
__unsafe_unretained NSString *playing;
__unsafe_unretained NSString *paused;
__unsafe_unretained NSString *broken;
} AMPlayerState;
const struct AMPlayerStateReadable AMPlayerState =
{
.ready = @"READY",
.completed = @"COMPLETE",
.playing = @"PLAYING",
.paused = @"PAUSED",
.broken = @"BROKEN"
};
次に、次のように使用できます。
NSString *status = AMPlayerState.ready;
使いやすく、読みやすい。誰かがこのアプローチの利点/欠点で回答を更新/編集するといいでしょう。
于 2016-01-06T09:45:49.257 に答える
1
インライン配列関数を探していると思います。例えば
@[@"stringone",@"stringtwo",@"stringthree"];
そうでない場合は、オブジェクトを列挙できるかどうかわかりません。
ただし、文字列の静的配列を持ち、インデックスに列挙型参照オブジェクトを置くことができます。
于 2012-11-01T06:26:41.337 に答える