为什么内部类出现在ProductName-Swift.h中?我可以手动更改此文件吗?

时间:2019-07-02 11:19:53

标签: ios objective-c swift bridging-header

我构建了依赖于另一个Objective C框架的Swift框架(因此,该项目包含桥接头文件)。当我在框架的标题内打开自动生成的ProductName-Swift.h文件时,我看到了我不想公开的类(带有内部修饰符的类)。根据{{​​3}},这是合法的:

  

默认情况下,生成的标头包含Swift的接口   标有public或open修饰符的声明。如果您的应用   目标有一个Objective-C桥接头,生成的头也   包括标有内部修饰符的接口。

但是为什么会发生呢?有人可以解释一下吗?根据我的逻辑,如果我决定将一些代码制作为内部代码,则不应在框架之外使用,也不应将其公开在标头中。

无论如何,我可以编写一个bash脚本,该脚本将在构建后从ProductName-Swift.h中删除内部类和函数,但是我不确定是否可以这样做。例如,当在我的Objective C项目中将我的Swift框架与“固定的” ProductName-Swift.h一起使用时,用户会遇到任何问题吗?

1 个答案:

答案 0 :(得分:1)

根据Swift的官方文档SwiftDoc,它声明内部修饰符为:

  

内部访问使实体可以在任何源文件中使用   从其定义模块中获取,但不在此源文件之外   模块。通常,在定义应用或   框架的内部结构。

现在,如果您已将任何这些内部类公开给Objective-C,则自动创建的桥接标头可能会包含该类定义。

因为,xCode创建桥接头是为了使这些快速类可以从您可以在该项目中添加/写入的任何objc-c源文件中使用。

如果从未在任何obj-C文件中使用这些类,则可以尝试从它们中删除@objc(如果它们已公开),或放置文件私有访问修饰符。

在这种情况下,您可以做的是在构建框架时,可以检查自动生成的头文件是否保留为xCode的构建阶段设置中的公共头。如果它是公共的,则将其设为私有,并为您的框架用户公开一个自定义标头,您只需在其中放置所需的Swift类定义即可。

如果它根本没有作为标题列出,并且您选择不使用框架中任何obj-C文件中的那些内部类(如果您决定在项目中使用任何obj-C文件, ),那么请确保您可以继续执行脚本,以从该桥接标头中删除不需要的类定义。

希望这会有所帮助。