21

NSString などの objc オブジェクトを列挙する方法を探しています。enum の新しい方法を提供する Xcode4+ のバージョンに新しい機能があったことを覚えていますが、明確ではありません。それ知ってる人いる?

4

7 に答える 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 に答える