1. ホーム
  2. c

[解決済み] objective-c の typedef を同等の文字列に変換する。

2022-05-05 02:31:21

質問

私の.hファイルでこのように宣言されたtypedefがあると仮定します。

typedef enum {
  JSON,
  XML,
  Atom,
  RSS
} FormatType;

typedefの数値を文字列に変換する関数を作りたい。 例えば,メッセージ [self toString:JSON] が送信された場合、'JSON'が返されます。

この関数は次のようなものです。

-(NSString *) toString:(FormatType)formatType {
  //need help here
  return [];
}

ちなみに、この構文でやってみると

[self toString:FormatType.JSON];

を使用して、typedef 値をメソッドに渡すと、エラーが表示されます。 何が足りないのでしょうか?

解決方法は?

これは本当にC言語の質問で、Objective-C(C言語のスーパーセット)に特化したものではありません。C言語の列挙型は整数で表現されます。だから、enumの値が与えられたら文字列を返す関数を書く必要がある。これにはいろいろなやり方がある。文字列の配列で、enum 値を配列のインデックスとして使用する方法や、マップ構造体(例えば NSDictionary しかし、これらのアプローチは、変換を明示的に行う関数ほど明確ではありません(配列のアプローチも、古典的な C の方法は、enum 値が 0 から連続していない場合は危険です)。このようなものがあればうまくいくと思います。

- (NSString*)formatTypeToString:(FormatType)formatType {
    NSString *result = nil;

    switch(formatType) {
        case JSON:
            result = @"JSON";
            break;
        case XML:
            result = @"XML";
            break;
        case Atom:
            result = @"Atom";
            break;
        case RSS:
            result = @"RSS";
            break;
        default:
            [NSException raise:NSGenericException format:@"Unexpected FormatType."];
    }

    return result;
}

enum 値の正しい構文についてのご質問ですが、値だけを使用する(例. JSON でなく FormatType.JSON sytaxを使用します。 FormatType は型であり、enum値(例えば JSON , XML など)は、その型に割り当てることができる値です。