当我使用Objective-C中定义的宏时,Swift条件编译无法正常工作

Kan Chen

我在Objective-C头文件中定义了一个简单的宏,然后通过项目桥接头将该头文件导入Swift。我可以在Swift中将此宏用作常量,但是当我使用它进行条件编译时,它无法正常工作。

我在Xcode 10.2.1中创建了一个简单的项目,并添加了一些代码来重现它。在ViewController.h中

#define TEST_FLAG 1

@interface ViewController : UIViewController
@end

在ViewController.m中

#import "testMacro-Swift.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    SwiftClass *s = [[SwiftClass alloc] init];
    [s printMSG];

#if TEST_FLAG
    NSLog(@"Objc works.");
#endif
}

在testMacro-Bridging-Header.h中

#import "ViewController.h"

迅捷文件

@objc class SwiftClass: NSObject {
    @objc func printMSG() {
        print("Macro \(TEST_FLAG)")
        #if TEST_FLAG
        print("compiled XXXxXXXXX")
        #endif
    }
}

控制台输出

Macro 1
2019-07-03 14:38:07.370231-0700 testMacro[71724:11911063] Objc works.

我希望compiled XXXxXXXXX在之后打印Macro 1,但不会。

我很好奇为什么会这样。我的项目混合了objc和swift。我不想迅速声明相同的标志。

阿纳托利P

根据这篇Apple文章,https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/using_imported_c_macros_in_swift,简单的C(和Objective-C)宏作为全局常量导入了Swift。您的行的输出证明了这一点

print("Macro \(TEST_FLAG)")

片段

    #if TEST_FLAG
    print("compiled XXXxXXXXX")
    #endif

使用different TEST_FLAG,这是Swift预处理器标志。您可以在“构建设置”->“活动编译条件”TEST_FLAG下或“构建设置”->“其他Swift标志”下定义它-DTEST_FLAG

上面解释了为什么会这样。我想不出一种简单的方法来避免为Xcode中的Objective-C和Swift预处理器分别定义相同的标志。如果您只想控制是否基于执行某些Swift代码,则TEST_FLAG可以执行以下操作:

if TEST_FLAG != 0 {
        print("compiled XXXxXXXXX")
}

但是,如果要控制代码的编译,则可能必须TEST_FLAG对Objective-C和Swift使用单独的,并确保它们是一致的。为了帮助使它们一致,可以在中设置TEST_FLAGObjective-C代码使用的代码Other C Flags,该代码允许您为不同的SDK,体系结构和内部版本(发布/调试)定义不同的标志。主动编译条件允许相同的灵活性。

促进(Objective-)C和Swift编译器标志一致的另一个技巧是创建一个新的用户定义的构建设置:单击“+构建设置”下搜索框左侧。

说,调用它COMMON_TEST_FLAG并将其值设置为TEST_FLAG然后添加-D$(COMMON_TEST_FLAG)到其他C标志和其他Swift标志。现在,在构建代码时,TEST_FLAG将在目标内的Objective-C和Swift代码中定义代码。如果您不想定义它,只需将其值更改为其他值COMMON_TEST_FLAG即可。不过,需要注意以下几点:

  • 您不能为COMMON_TEST_FLAG空:这将导致其他标志仅为-D,从而导致生成错误。
  • 确保的值COMMON_TEST_FLAG与其他地方定义的宏不冲突。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我们尝试使用@Value注释访问appliction.properties中的值时,trim()无法正常工作

当我使用其他片段时,viewpager在lollipop 5.0中无法正常工作

当我使用节点js设置404时,当我重新加载页面时无法正常工作

当我在docker上使用node-alpine时,它无法正常工作

当我在ngOnInit()中使用表单组和服务时,表单无法正常工作

当我使用Objective C在IOS中将SeachView添加为titleView时,NavBar在其底部显示空白

当我使用索引时,Slick Slider slickAdd无法正常工作

当我使用计时器时,FutureBuilder无法正常工作

当我使用下划线符号时,属性JsonProperty在.NET Core 3.1中无法正常工作

当我使用index.php / User / login可以正常工作时,但是当我使用User.login时即使在codeigniter中删除了index.php也无法正常工作

为什么当我部署到AWS时,我的“使用google登录”(firebase + React)却无法正常工作

laravel资源功能可以正常工作,但是当我手动使用它时却无法正常工作

当我安装编译的应用程序时,c#Language.resx无法正常工作

当我在if语句中使用“或”时,它在discord.py中可以正常工作

当我使用附加时,jQuery将无法正常工作

当我使用其他一些类实现MainWindow时,DataContext无法正常工作

当我将其放在单独的Java文件中时,我的Asyntask无法正常工作

当我尝试计算表中的行数时,为什么我的PHP无法正常工作?

当我重新定义回调函数的时间间隔时,speakhere示例无法正常工作

当我使用input的display:none属性时,jQuery悬停无法正常工作

当我使用Direct Line API回复.Prompts.choice()时,我的机器人无法正常工作

当我在函数中使用if语句时,为什么我的javascript无法正常工作

当我使用较新的Apache版本(2.4)时,重写规则无法正常工作

当我在条件下使用 true 时,strpos 函数无法正常工作,为什么?

当我在 swift 中调用objective-c 方法时崩溃了

当我使用 javascript 使用内部地图时,Promise 无法正常工作

C++ - 当我使用 sprintf() 函数时程序崩溃(std::cout 工作正常)

当我将 & 与 if 条件一起使用时,我的 python 代码不起作用;但是当我使用嵌套的 if 循环时它工作正常

`else if` 条件在我的 c 程序中无法正常工作