gpt4 book ai didi

swift - 带有 return 语句的宏的替代方案

转载 作者:行者123 更新时间:2023-11-28 08:07:32 24 4
gpt4 key购买 nike

在我的 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
...
}

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

最佳答案

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

#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 重现相同内容。

关于swift - 带有 return 语句的宏的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com