【问题标题】:Why internal classes appear in ProductName-Swift.h? May I change this file manually?为什么内部类出现在 ProductName-Swift.h 中?我可以手动更改此文件吗?
【发布时间】:2019-11-13 00:48:14
【问题描述】:

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

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

但是为什么会这样呢?谁能给我解释一下,好吗?根据我的逻辑,如果我决定将某些代码设为内部代码,则不应在我的框架之外使用它,也不应在标头中公开它。

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

【问题讨论】:

标签: ios objective-c swift bridging-header


【解决方案1】:

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

内部访问使实体可以在任何源文件中使用 来自他们的定义模块,但不在此之外的任何源文件中 模块。在定义应用程序或 框架的内部结构。

现在,如果您向 Objective-C 公开了这些内部类中的任何一个,那么自动创建的桥接头可能会包含该类定义。

因为 Xcode 创建桥接头是为了让这些 Swift 类可以从您可以在该项目中添加/写入的任何 Obejctive-C 源文件中使用。

如果这些类永远不会在任何 Objective-C 文件中使用,您可以尝试从它们中删除 @objc(如果它们已经暴露),或者放置文件私有访问修饰符。

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

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2015-01-10
    相关资源
    最近更新 更多