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;
}

我有两个疑问:

  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 回答