【问题标题】:Macro not working as required in Objective-C宏在 Objective-C 中没有按要求工作
【发布时间】:2015-09-10 07:21:01
【问题描述】:

我有一个宏,很简单,但我不明白问题出在哪里?我得到了错误:

"预期的;在表达式之后"

这是一个宏定义:

#define SEGCONTROL (itemArray, segmentedControl)      \
segmentedControl = [[SuperSegmentedControll alloc] initWithItems:itemArray];                                        \
segmentedControl.frame = CGRectMake(0, 0, 60, 28);     \
segmentedControl.layer.cornerRadius = 05;              \
[segmentedControl setTintColor:[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:102.0/255.0 alpha:1]];                  \
segmentedControl.backgroundColor = [UIColor colorWithRed:19.0/255.0 green:62.0/255.0 blue:137.0/255.0 alpha:1];              [segmentedControl setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]} forState:UIControlStateNormal];                                \
[segmentedControl setTitleTextAttributes:               @{NSForegroundColorAttributeName:[UIColor whiteColor]} forState:UIControlStateSelected]; \

我打电话如下:

 NSArray *itemArray = [NSArray arrayWithObjects: @"Save", nil];
 SuperSegmentedControll *segmentedControl;
 SEGCONTROL(itemArray, segmentedControl);

我想创建宏作为在许多地方使用的类似代码。为了保存,取消 ETC。

【问题讨论】:

  • 为什么这么复杂?将这些东西放入方法或函数有什么问题?
  • 宏是编译器的开销,复杂的宏也会导致内存消耗!

标签: ios objective-c macros


【解决方案1】:

这个失败的原因是因为#define宏名SEGCONTROL和参数列表(itemArray, segmentedControl)之间有一个空格。这实质上是将SEGCONTROL 定义为(itemArray, segmentedControl) 而不是代码sn-p。要解决此问题,只需删除SEGCONTROL之后的空格

#define SEGCONTROL(itemArray, segmentedControl) \ ...

但是我强烈建议反对使用这种方法,而不是在你的 SuperSegmentedControll 类上使用一个方法(它可能应该有一个 L 和更多描述性名称)设置控件。这样您将获得更好的编译器检查。像这样的:

@implementation SuperSegmentedControl

- (instancetype)initWithItems:(NSArray *)items {
    self = [super initWithItems:items];
    if (self) {
        self.frame = CGRectMake(0, 0, 60, 28);
        self.layer.cornerRadius = 05;
        [self setTintColor:[UIColor colorWithRed:0.0/255.0 green:0.0/255.0 blue:102.0/255.0 alpha:1]];
        self.backgroundColor = [UIColor colorWithRed:19.0/255.0 green:62.0/255.0 blue:137.0/255.0 alpha:1];
        [self setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]} forState:UIControlStateNormal];
        [self setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]} forState:UIControlStateSelected];
    }
    return self;
}

@end

将按如下方式使用:

NSArray *itemArray = [NSArray arrayWithObjects: @"Save", nil];
SuperSegmentedControl *segmentedControl = [[SuperSegmentedControl alloc] initWithItems:itemArray];

【讨论】:

  • 是的。这将是迄今为止最受期待的标准方式。
  • 所以这与 Objective-C 无关,同样的宏在 C、C++ 和 Objective-C++ 中也会因为完全相同的原因而失败。
猜你喜欢
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2011-11-28
  • 2016-08-21
相关资源
最近更新 更多