是否应该为 Swift 类添加前缀以避免潜在的 Objective-C 兼容性冲突问题

2024-01-29

为了提供交叉兼容性,Swift 允许生成桥接标头,以便 Objective-C 可以与 Swift 类进行通信。

由于 Swift 出色的命名空间,我们不再需要担心为 Swift 文件添加前缀,因为它们是由其包含的框架命名的。 AUIView例如隐式命名空间为UIKit.UIView.

现在苹果正在推动框架,我想知道当存在两个具有相同符号的快速桥接标头时,避免标头冲突的最佳实践是什么。

举个例子:假设我们有两个框架声明了一个名为 Swift 类Downloader. The Downloader提供接口:downloadWithURL(url: NSURL)

生成桥接标头将为这两个框架生成一个 Downloader-Swift.h 文件。从而造成碰撞。避免这种情况的最佳做法是什么?


据苹果工程师介绍<#Module Name#>-Swift.h标头使用一个宏来破坏名称以避免冲突(请参阅 WWDC 视频深入 Swift 互操作性 https://developer.apple.com/videos/wwdc/2014/,从 45 分 40 秒开始)。他们举了一个例子Document斯威夫特类:

SWIFT_CLASS("_TtC5MyApp10Document")
@interface Document : UIDocument
// rest of the interface...

对于您的 Swift 代码,该类将作为MyApp.Document, if MyApp是它所在的模块。因此,如果您有两个来自不同模块的同名 Swift 类 – 比如说,一个是您自己的,另一个来自开源 Swift 框架SomeFramework– 它们将可供您的 Swift 代码使用MyApp.Document and SomeFramework.Document...

然而,在 Obj-C 方面,将这两个类导入相同的词法范围会导致Duplicate interface definition for class 'Document'编译器错误。这只是 Obj-C...不过,在绝大多数情况下,这不会成为问题,因为只要它们不侵犯彼此的领土,您仍然可以在应用程序中导入这两个类。事实上,您想多久使用一次MyApp.Document and SomeFramework.Document在您的应用程序的同一模块中?随着我们进入更快的时代,与许多紧迫的问题相比,例如多核、分布式、功能性、触觉、预期、可穿戴、自主等,我不确定这个特定问题是否需要采取特定的策略......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否应该为 Swift 类添加前缀以避免潜在的 Objective-C 兼容性冲突问题 的相关文章

随机推荐