gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:54:02 40 4
gpt4 key购买 nike

我在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 XXXxXXXXXMacro 1 之后打印,但事实并非如此。

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

最佳答案

基于这篇 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

使用不同的 TEST_FLAG,这是一个 Swift 预处理器标志。您可以在 Build Settings -> Active Compilation Conditions 下将其定义为 TEST_FLAG 或在 Build Settings -> Other Swift Flags 下定义为 -DTEST_FLAG

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

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

但是,如果您想控制代码的编译,那么您可能必须为 Objective-C 和 Swift 使用单独的 TEST_FLAG 并确保它们一致.为了使它们保持一致,您可以在 Other C Flags 中设置 Objective-C 代码使用的 TEST_FLAG,这允许您为不同的 SDK、架构定义不同的标志,和构建类型(发布/调试)。事件编译条件允许同样的灵 active 。

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

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

  • 你不能让 COMMON_TEST_FLAG 为空:这会导致另一个标志只是 -D,导致构建错误。
  • 确保 COMMON_TEST_FLAG 的值不与在别处定义的宏。

关于objective-c - 当我使用 objective-c 中定义的宏时,Swift 条件编译无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56878455/

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