具有return语句的宏的交替

时间:2017-06-21 15:42:09

标签: swift swift3 macros

在我的MotionManager包装器类中,我有一个代码片段,它为每个函数重复。此代码可以使应用程序在模拟器上运行,而无需在设备中使用陀螺仪。我正在使用的代码片段如下所示:

#if !TARGET_IPHONE_SIMULATOR && TARGET_OS_IPHONE
    return // Do nothing if in simulator
#endif

我想用一行代码替换这段代码,明确说明它的作用,并不是那么难看。如果我用C ++编写这个,我会简单地使用看起来像这样的宏:

#define skipIfSimulator #if !TARGET_IPHONE_SIMULATOR && TARGET_OS_IPHONE /
                            return /
                        #endif

所以不要这样:

func foo() {
   #if !TARGET_IPHONE_SIMULATOR && TARGET_OS_IPHONE
       return // Do nothing if in simulator
   #endif
   ...
}

会有这样的:

func foo() {
   skipIfSimulator
   ...
}

实现这一目标的最佳方法是什么,同时最好不添加开销?

1 个答案:

答案 0 :(得分:0)

我想出了一个非常糟糕的解决方案。但它可以满足您的需求。

#if !TARGET_IPHONE_SIMULATOR && TARGET_OS_IPHONE
BOOL const kIsSimulator = NO;
#else
BOOL const kIsSimulator = YES;
#endif

#define SIM(x) if (kIsSimulator) {x; return;}

用法:

SIM(`any_statement`);

使用示例:

SIM(NSLog(@"on Simulator"));
or,
SIM(); // No statement at all

自包含示例: Objective-C

#import "ViewController.h"

#if !TARGET_IPHONE_SIMULATOR && TARGET_OS_IPHONE
BOOL const kIsSimulator = NO;
#else
BOOL const kIsSimulator = YES;
#endif

#define SIM(x) if (kIsSimulator) {x; return;}

@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [self printAMessage];
}

- (void)printAMessage {
    SIM(NSLog(@"on Simulator"));
    NSLog(@"on iPhone");
}
@end

不幸的是, Swift 无法重现。