我有一个现有项目,其中包含Swift和Objective C .h和.m文件。 .h文件之一中有大量
#define kSomeConstant @“某些字符串”
当Swift文件位于应用程序的子项目的框架中时,如何使这些文件可用于项目中的Swift文件?
到目前为止,我已经尝试在.m文件类定义中使包装器静态方法如:
+(NSString *)objc_kSomeConstant {return kSomeConstant; }
而且我已经尝试在.h中执行以下操作:
extern NSString * const kSomeConstant;
。m文件中的定义:
NSString * const kSomeConstant = @“某些字符串”
两种方法均无效。
要清楚,您在项目的主要应用程序目标的Objective-C头文件中有一些定义,并且希望使它们可用于作为主要项目的子项目的框架目标中的Swift文件。通常,您的应用程序依赖于框架中的定义,而不是相反。要在应用程序和框架之间共享这些定义,请创建可被双方使用的clang编译器module。
为此,将带有定义的标头移到一个文件夹(我们将其称为“ Common”)中,并在该文件夹中创建一个名为“ module.modulemap”的文件,其中包含以下内容:
设置(在快速编译器-搜索路径下)设置为此文件夹的路径(例如,module Common { header "CommonDefinitions.h" }
下一步,在您的框架目标中,将导入路径
$(SRCROOT)/Common
)。您可能还需要将此文件夹添加到主应用程序的Header Search Paths设置中,以便它将继续成功编译。现在,只需添加语句import Common
,就可以从框架中的Swift文件访问定义。 (请注意,名称#define
d作为Objective-C字符串文字,例如您的示例中的kSomeConstant
,将作为String
常量导入到Swift中;无需将它们重写为extern NSString *
声明。)