0

基本的に配列の内容に文字を追加するこのメソッドがあります(デモンストレーション)

- (NSMutableArray *) addTheLetterZ:(NSArray *)array {
    NSMutableArray *addedLetterArray = [[NSMutableArray alloc] init];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [addedLetterArray addObject:[NSString stringWithFormat:@"%@ Y", obj]];
    }];
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [addedLetterArray addObject:[NSString stringWithFormat:@"%@ Z", obj]];
    }];
    return addedLetterArray;
}

私には2つの疑問があります:

  1. どのメソッドもマクロに変換できますか?

  2. 関数をマクロに変換するときに従うべき一般的な経験則はありますか?

    私は他の質問を見てきましたが、それらのソリューションでも、do-loopソリューションを実行してこのメ​​ソッドをマクロに変換しようとするとエラーが発生します。

4

2 に答える 2

2

Cマクロのことですか?

#define macro_name(array, addedLetterArray, str)                        \
     [(array) enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { \
        [(addedLetterArray) addObject:[NSString stringWithFormat:(str), obj]]; \
    }];

- (NSMutableArray *) addTheLetterZ:(NSArray *)array {
    NSMutableArray *addedLetterArray = [[NSMutableArray alloc] init];
    macro_name(array, addedLetterArray, @"%@ Y")
    macro_name(array, addedLetterArray, @"%@ Z")
    return addedLetterArray;
}

右?

于 2012-07-31T23:35:08.187 に答える
1

投稿したリンクは、複数行のマクロを記述する正しい方法です。質問に答えるには:

  1. メソッドを含め、任意の数のコード行をマクロに変換できます。マクロは、エディターでのカット アンド ペーストのようなものです。
  2. マクロの使用には多くの落とし穴があります。このリファレンスでは、マクロが悪である理由を少なくとも 4 つ説明しています。

問題が発生した場合、最善の方法は「マクロ化」の試みを投稿することです。

ただし、マクロを使用して関数またはメソッドの呼び出しを置き換える必要がある場合はほとんどありません。ほとんどの場合、マクロは間違った理由で使用されます。たとえば、ほんの数行の長さのコードを繰り返していて、これらの行を関数呼び出しではなくマクロに置き換えた方が効率的だと考える場合、通常は間違っています。最新のコンパイラは、関数をいつインライン化する必要があるかを判断するのに非常に効率的であり、マクロと同じ利点を効果的に提供しますが、欠点はありません。マクロには、型チェックなどのコンパイラ サポートがなく、エラーが発生しやすく、記述が困難です。

何を考えていたのかわかりませんが、マクロではなく関数を使用する方法に関する独自のコードの例を次に示します。

void AddLetterToArray(NSArray *array, NSMutableArray *addedLetterArray, NSString *aLetter)
{
    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [addedLetterArray addObject:[NSString stringWithFormat:@"%@ %@", obj, aLetter]];
    }];
}

- (NSMutableArray *) addTheLetterZ:(NSArray *)array {
    NSMutableArray *addedLetterArray = [[NSMutableArray alloc] init];
    AddLetterToArray(array, addedLetterArray, @"Y");
    AddLetterToArray(array, addedLetterArray, @"Z");
    // ...
    return addedLetterArray;
}
于 2012-07-31T23:35:47.423 に答える