在Swift中使用Obj-C类扩展?

时间:2016-03-24 13:46:49

标签: objective-c swift bridging-header

我使用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'”。

我在这里错过了一步吗?

2 个答案:

答案 0 :(得分:2)

根据https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

  

您可以通过选择文件>自行创建桥接标头。新>   文件> (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中编辑的标题。所以你必须查看文件检查器以确保它将桥接头放在正确的位置!