gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:57:58 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

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

关于ios - 是否应该为 Swift 类添加前缀以避免潜在的 Objective-C 兼容性冲突问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26136142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com