我使用Xcode的Add files...
向我的Swift项目添加了一些Obj-C代码(优秀的Expressions),但它并没有问我是否想制作一个桥接头。所以我自己在Obj-C代码组中创建了一个,将其编辑为#import
我需要的单个头,并确保在Build Settings中的Swift编译器中引用了该文件。然后我查看了Obj-C代码并确保.m文件在目标中 - 它们是,并且它们在Compile Sources中列出。
有问题的标题包含:
@interface NSNumber (Expression)
+ (NSNumber *)numberByParsingExpression:(NSString *)expression;
+ (NSNumber *)numberByParsingExpression:(NSString *)expression withVariables:(NSDictionary *)varDictionary;
@end
现在我尝试使用与this post相同的基本语法来调用此代码:
let result = NSNumber.numberByParsingExpression(f.1)
以及主题的几个变体。但它不会编译,“类型'NSNumber'没有成员'numberByParsingExpression'”。
我在这里错过了一步吗?
答案 0 :(得分:2)
您可以通过选择文件>自行创建桥接标头。新> 文件> (iOS,watchOS,tvOS或OS X)>来源>头文件。
您需要编辑桥接头文件以公开您的 您的Swift代码的Objective-C代码。 在Objective-C桥接头文件中,导入每个Objective-C 你希望暴露给Swift的标题。例如:
在构建设置中,在Swift编译器 - 代码生成中,确保 Objective-C Bridging Header构建设置下有一条路径 桥接头文件。路径应该与您的项目相关, 类似于在Build中指定Info.plist路径的方式 设置。在大多数情况下,您不需要修改此设置。 此桥接头文件中列出的任何公共Objective-C标头 将在Swift中看到。 Objective-C功能将是 在没有的情况下自动在该目标内的任何Swift文件中提供 任何进口报表。使用相同的自定义Objective-C代码 您使用系统类的Swift语法。
如果您已经正确地执行了此操作,但仍然无效,请尝试删除项目派生数据,并清理项目构建。
答案 1 :(得分:1)
好的,原来是Xcode peccadillo。
在组中创建头文件时,它实际上将其物理放置在源文件夹中。所以在我的情况下,标题是在/project/subproject/.h中创建的,尽管它在Xcode中出现,它是基本文件夹/project/.h的一部分。
所以实际上有两个标题,一个在正确的位置,其中没有任何内容,另一个在错误的位置,即在Xcode中编辑的标题。所以你必须查看文件检查器以确保它将桥接头放在正确的位置!