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

标签 ios objective-c swift bridging-header

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

By default, the generated header contains interfaces for Swift declarations marked with the public or open modifier. If your app target has an Objective-C bridging header, the generated header also includes interfaces marked with the internal modifier.

但为什么会这样呢?谁能给我解释一下?根据我的逻辑,如果我决定将某些代码作为内部代码,那么它不应该在我的框架之外使用,也不应该暴露在 header 中。

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

最佳答案

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

Internal access enables entities to be used within any source file from their defining module, but not in any source file outside of that module. You typically use internal access when defining an app’s or a framework’s internal structure.

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

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

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

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

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

希望这会有所帮助。

关于ios - 为什么内部类出现在 ProductName-Swift.h 中?我可以手动更改此文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56851311/

相关文章:

ios - 如何重置 subview ?

ios - 如何将文本字符串转换为十六进制字符串?

ios - 如何在使用 AFNetworking 的 iOS 应用程序上通过 WiFi 拥有 FlashAir 接入点,同时仍然通过蜂窝数据连接互联网?

ios - 如何在 Swift 或 Obj-C 中访问 AFP 或 SMB 共享(例如时间胶囊)

objective-c - 比较 NSDecimalNumber 的不同方法

swift - RxSwift 合并不同类型的 Observables

ios - 下载启用 Fairplay 的视频时获取服务器播放上下文时出错

ios - 初始 View Controller 如何快速工作?

objective-c - 为什么 nil/NULL block 在运行时会导致总线错误?

Swift 2/解析如果 PFUser id 在 Likes 类中相同