Objective c 如何在objective C中将方法转换为宏

Objective c 如何在objective C中将方法转换为宏,objective-c,c,macros,Objective C,C,Macros,我有一种方法,基本上是将字母添加到数组中的内容中(演示) 我有两个疑问: 是否可以将任何方法转换为宏 将函数转换为宏时是否有一般的经验法则 我已经看过其他方法,但即使在它们的解决方案中,当我尝试使用do循环解决方案将此方法转换为宏时,也会出现错误 你是说C宏吗 #define macro_name(array, addedLetterArray, str) \ [(array) enumerateObjectsUsingBlock:^(

我有一种方法,基本上是将字母添加到数组中的内容中(演示)

我有两个疑问:

  • 是否可以将任何方法转换为宏

  • 将函数转换为宏时是否有一般的经验法则

    我已经看过其他方法,但即使在它们的解决方案中,当我尝试使用do循环解决方案将此方法转换为宏时,也会出现错误

  • 你是说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;
    }
    
    对吗?

    你是说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;
    }
    

    对吗?

    您发布的链接是编写多行宏的正确方法。回答您的问题:

  • 可以将任意数量的代码行转换为宏,包括方法。宏就像编辑器中的剪切粘贴
  • 使用宏时有很多陷阱。本参考文件至少描述了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;
    }
    

    您发布的链接是编写多行宏的正确方法。回答您的问题:

  • 可以将任意数量的代码行转换为宏,包括方法。宏就像编辑器中的剪切粘贴
  • 使用宏时有很多陷阱。本参考文件至少描述了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;
    }
    

    看来你是对的,我使用的宏不正确。你提供的链接很有用。看来你是对的,我使用的宏不正确。你提供的链接很有用