0

我使用 Xcode 向我的 Swift 项目中添加了一些 Obj-C 代码(优秀的ExpressionsAdd files... ),但它没有问我是否想制作一个桥接头。所以我自己在 Obj-C 代码组中创建了一个,将其编辑为#import我需要的单个标头,并确保在构建设置中的 Swift 编译器中引用了该文件。然后,我查看了 Obj-C 代码并确保 .m 文件在目标中——它们是,并且它们在编译源中列出。

有问题的标题包含以下内容:

@interface NSNumber (Expression)
+ (NSNumber *)numberByParsingExpression:(NSString *)expression;
+ (NSNumber *)numberByParsingExpression:(NSString *)expression withVariables:(NSDictionary *)varDictionary;
@end

现在我正在尝试使用与本文相同的基本语法来调用此代码

let result = NSNumber.numberByParsingExpression(f.1)

以及主题的几个变体。但它不会编译,“类型'NSNumber'没有成员'numberByParsingExpression'”。

我在这里错过了一步吗?

4

2 回答 2

2

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

您可以通过选择“文件”>“新建”>“文件”>(iOS、watchOS、tvOS 或 OS X)>“源”>“头文件”来自己创建桥接头。

您需要编辑桥接头文件以将您的 Objective-C 代码公开给您的 Swift 代码。在你的 Objective-C 桥接头文件中,导入你想要暴露给 Swift 的每个 Objective-C 头文件。例如:

在 Build Settings 中的 Swift Compiler - Code Generation 中,确保下的 Objective-C Bridging Header 构建设置具有桥接头文件的路径。该路径应该与您的项目相关,类似于在 Build Settings 中指定 Info.plist 路径的方式。在大多数情况下,您不需要修改此设置。此桥接头文件中列出的任何公共 Objective-C 标头对 Swift 都是可见的。Objective-C 功能将自动在该目标内的任何 Swift 文件中可用,无需任何导入语句。使用与系统类相同的 Swift 语法使用自定义的 Objective-C 代码。

如果您已经正确执行此操作,但仍然无法正常工作,请尝试删除项目派生数据,然后清理构建您的项目。

于 2016-03-24T14:04:57.873 回答
1

好的,这原来是一个 Xcode peccadillo。

当您在组内创建头文件时,它实际上将其物理放置在源文件夹中。所以在我的例子中,头文件是在 /project/subproject/.h 中创建的,尽管它出现在 Xcode 中是基本文件夹 /project/.h 的一部分。

所以实际上有两个标题,一个在正确的位置,其中没有任何内容,另一个在错误的位置,即在 Xcode 中正在编辑的那个。因此,您必须查看文件检查器以确保将桥接头放置在正确的位置!

于 2016-03-24T14:27:43.183 回答