如果类没有以 `@objc` 为前缀,是不是可以在 Objective-C 项目中使用用 Swift 编写的 pod?

Posted

技术标签:

【中文标题】如果类没有以 `@objc` 为前缀,是不是可以在 Objective-C 项目中使用用 Swift 编写的 pod?【英文标题】:Is it possible to use a pod written in Swift in an Objective-C project if the classes are not prefixed with `@objc`?如果类没有以 `@objc` 为前缀,是否可以在 Objective-C 项目中使用用 Swift 编写的 pod? 【发布时间】:2016-12-22 17:12:34 【问题描述】:

我要使用的 pod 在我要使用的类的开头没有前缀 @objc

我还能在 Objective-C 项目中使用 pod 吗?

--

PS:我的问题比How to import and use Swift Pod Framework in Objective-C Project 更笼统(关注#import 语句的问题)

【问题讨论】:

How to import and use Swift Pod Framework in Objective-C Project的可能重复 【参考方案1】:

ObjC 中的所有类都必须符合objc_object 结构。在绝大多数情况下,这意味着它是NSObject 的子类。还有一些其他方法可以使类符合objc_object 结构:子类化NSProxy 或者只是巧妙地布置自己的结构以匹配它并添加挂钩,通常在系统库中,以处理差异,例如在免费桥接或 libSystem 中。默认情况下 Swift 对象不这样做,因此它们对 ObjC 不可见。

添加@objc 不是您需要的。事实上,这通常不会编译。您需要使该类成为NSObject 的子类。这是您无法使用编译器选项进行的重大更改。它改变了内存布局、消息分发和其他行为。至少需要修改源代码并重新编译。

【讨论】:

【参考方案2】:

正如苹果guideline 所说,

私有声明不会暴露给 Objective-C,除非它们是 也用@IBAction、@IBOutlet 或@objc 显式标记。

所以,如果你在类定义之前有一个“open”关键字,应该没问题。

P.S.:至少,在我的 Objective-C 项目中导入 TTGSnackbar pod 没有问题

【讨论】:

不,它只是一个public class。本项目:github.com/alehed/SyntaxKit public 和 open 是等价的,所以没关系 当我想在objective-C类中使用它时,Swift项目的类不可用。也许我应该创建一个中间 Swift 类。 好吧,在 SyntaxKit/SyntaxKit.podspec 中没有为 spec.module_name 指定选项。尝试在此文件中添加以下行:spec.module_name = "SyntaxKit"。清理并重建项目 它不适用于 ObjC 类。看来我只能访问子类NSObject 的类。

以上是关于如果类没有以 `@objc` 为前缀,是不是可以在 Objective-C 项目中使用用 Swift 编写的 pod?的主要内容,如果未能解决你的问题,请参考以下文章

Objc中为何某些类的属性要设置为copy而不是strong?

arm64 标志,如弧标志 (-fno-objc-arc)

将 C 结构重写为 ObjC 类(C 结构与 ObjC 类)

COM Interop的重命名/前缀类

ObjC,在以编程方式添加/删除后恢复为界面构建器自动布局约束?

类成员是不是需要在类定义中以 `class::` 为前缀?