【问题标题】:Should A Swift Class Be Prefixed To Avoid Potential Objective-C Compatibility Collision Issues是否应该为 Swift 类添加前缀以避免潜在的 Objective-C 兼容性冲突问题
【发布时间】:2014-11-25 23:38:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios objective-c macos swift


    【解决方案1】:

    根据 Apple 工程师的说法,<#Module Name#>-Swift.h 标头使用了一个宏来破坏名称以避免冲突(请参阅 WWDC 视频 Swift Interoperability In Depth,从 45 分 40 秒开始)。他们举了一个Document Swift 类的例子:

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

    对于您的 Swift 代码,如果 MyApp 是它所在的模块,则该类将以 MyApp.Document 的形式提供。因此,如果您有两个来自不同模块的同名 Swift 类 – 比如说,一个是来自开源 Swift 框架 SomeFramework 的您自己的和其他的 - 它们将以 MyApp.DocumentSomeFramework.Document 的形式提供给您的 Swift 代码...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-13
      • 2011-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2018-01-09
      相关资源
      最近更新 更多