2017-06-21 54 views
1

在我的MotionManager包装类中,我有这个代码片断,它重复它的每个函数。这个代码可以让应用程序在模拟器上运行,而不需要设备中的其他陀螺仪。代码段我使用看起来像这样:与return语句的宏替代

#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 
    ... 
} 

在不增加开销的情况下实现这一目标的最佳方法是什么?

回答

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 

遗憾的是不能与斯威夫特重现相同。