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

Posted

技术标签:

【中文标题】在 Swift 中使用 Obj-C 类扩展?【英文标题】:Using Obj-C class extension in Swift? 【发布时间】:2016-03-24 13:46:48 【问题描述】:

我使用 Xcode 的 Add files... 在我的 Swift 项目中添加了一些 Obj-C 代码(出色的 Expressions),但它没有问我是否想制作一个桥接头。所以我自己在 Obj-C 代码组中创建了一个,将其编辑为 #import 我需要的单个标头,并确保在构建设置中的 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'”。

我错过了一步吗?

【问题讨论】:

这能回答你的问题吗? How to call an Objective-C category method in Swift 【参考方案1】:

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

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

您需要编辑桥接头文件以公开您的 将 Objective-C 代码转换为 Swift 代码。 在您的 Objective-C 桥接头文件中,导入每个 Objective-C 您想向 Swift 公开的标头。例如:

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

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

【讨论】:

【参考方案2】:

好的,结果证明这是 Xcode peccadillo。

当您在 中创建头文件时,它实际上将其物理放置在源文件夹 中。因此,在我的情况下,标头是在 /project/subproject/.h 中创建的,尽管它在 Xcode 中显示为基本文件夹 /project/.h 的一部分。

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

【讨论】:

以上是关于在 Swift 中使用 Obj-C 类扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Swift 扩展实现委托方法

iOS Emoji编解码(OBJ-C/Swift)

仅当 iOS11 可用时才包含类的扩展

无法在 Swift 中扩展 Objective-C 类

使用 Objective-C 类别扩展 Swift 类

在 Swift 中使用 Obj-C 完成块