1

私はいくつかの定数を定義しました

#define val_a @"A"
#define val_b @"B"
#define val_c @"C"

これで、定義した定数と同じ名前のキーがいくつかあります。定数の値を出力したいと思います(定数キーを使用せずに)。私はもう試した、

- (NSString *) actualValForKey:(NSString *)key 
 {
     return key; //It will return **key** parameter, but I want to return the **constant value** as defined
 }

NSLog(@"Value = %@", [self actualValForKey:keys]);すべてのキーが動的であるように記述できますがNSLog(@"Value = %@", val_a);、この方法では記述できません。

ここでkeysは、 として来ますNSString

PS定数の識別。

出来ますか?代替案?

4

4 に答える 4

1

C++/ObjectiveC では、実行時にマクロの名前を取得できません。なぜなら、マクロ名はマクロ本体のコピーに置き換えられるからです。

ここでドキュメントを読むことができます

#define ディレクティブは通常、意味のある識別子を定数、キーワード、および一般的に使用されるステートメントまたは式に関連付けるために使用されます。定数を表す識別子は、「記号定数」または「マニフェスト定数」と呼ばれることがあります。ステートメントまたは式を表す識別子は「マクロ」と呼ばれます。このプリプロセッサのドキュメントでは、「マクロ」という用語のみが使用されています。マクロの名前がプログラム ソース テキストまたは他の特定のプリプロセッサ コマンドの引数で認識されると、そのマクロの呼び出しとして扱われます。マクロ名は、マクロ本体のコピーに置き換えられます。マクロが引数を受け入れる場合、マクロ名に続く実引数は、マクロ本体の仮パラメータに置き換えられます。

でも、どうしても必要なら。#defineファイル内のすべてのディレクティブを解析して NSDictionary を作成するビルド スクリプトを作成できます。コードで使用できるもの。

たとえば、ファイルを追加しました。これは、スクリプトの正しい使用法を示しています。

ここに画像の説明を入力

于 2012-12-25T11:21:49.853 に答える
0

これを探してくれてありがとう、ついに私は初心者の方法でそれを解決しました! ;)

- (NSString *) actualValForKey:(NSString *)key 
 {
     NSString *str = @"";

     if([key isEqualToString:val_a])
     {
        str = @"A";
     }
     else if([key isEqualToString:val_b])
     {
        str = @"B";
     }
     .
     .
     return str;
 }

PS定数#defineと同じ名前で更新する必要があります。

于 2012-12-25T13:02:02.217 に答える
0

これはプリプロセッサでkeys=val_a val_a getsあり、@"A" に置き換えて記述するとすぐに、その @"A" がメソッドに送信されます。

命名規則に従って、変数内で同じ名前になってしまわないように、すべてのマクロはブロック文字にする必要があります。

#define VAL_A @"A"
#define VAL_B @"B"
#define VAL_C @"C"

または、同様のことを行う必要がある場合は、keyValue のすべてのセットを含む辞書を作成できます。

編集:

この定義を使用すると、渡された値が文字列に変換され、キーに格納できます。

#define RET_NAME(n) #n

NSString *key=[NSString stringWithFormat:@"%s", RET_NAME(val_a)];

これで、keyが保存されval_aます。

于 2012-12-25T11:25:13.517 に答える
0

私は通常、名前と値を次のように分離します。#defines または const 文字列を使用して物事の名前を定義し、実際の値を辞書に詰め込みます。その理由は、これはプレーンな #define よりも優れた値の外部ソースへの移行に耐えられるからです。また、NSUserDefaults などの他のメソッドでもうまく機能します (これはカフ外です)。

#define kNameForThing
#define kNameForOtherThing

- (void) initValues {
   // _defaults is a NSDictionary
   _defaults = @{
        kNameForThing : @"A",
        KNameForOtherThing : @"B"
   };
}

- (void) useValue {
   NSString value = _defaults[kNameForThing];
   ....
}

あらゆる種類の一貫性テストを実行したり、値が存在するかどうか、予想されるすべてのキーが存在するかどうかを確認したりできます。ファイルからこの情報をロードする場合、これはより重要になります。

また、より表現力豊かな名前を使用すると、長期的には役立ちます。これは、オブジェクトの作成とアクセスを容易にするために、新しい目的の c リテラル構文を使用しています

于 2012-12-25T15:30:39.047 に答える