2017-06-21 4 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() { 
    skipIfSimulator 
    ... 
} 

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

これがあるでしょうできればオーバーヘッドを追加しながらこれを達成する最善の方法は何ですか?

答えて

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 

は残念ながらスウィフトと同じように再現することはできません。

関連する問題