【问题标题】:What is the use of bridging header? Should we avoid using bridging header?桥接头有什么用?我们应该避免使用桥接头吗?
【发布时间】:2016-07-26 07:36:38
【问题描述】:

桥接头有什么用?

是否只是为了在同一个项目中使用 Objective-C 和 Swift 代码?

我们应该避免使用桥接头吗?

说,如果有两个非常相似的第三方库;其中一个在 Objective-C 中,另一个在 Swift 中。我们应该使用 Swift 库还是使用 Objective-C 库。使用桥接头有什么缺点吗?

【问题讨论】:

  • 你不能,如果你的项目选择了swift语言并且你想在同一个项目中使用一些objective-c文件,那么你需要使用桥接头,反之亦然。

标签: objective-c swift bridging-header


【解决方案1】:

Apple 写了一本深入探讨这一点的好书。可以在这里找到:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

我会引用它来回答你的问题:

"桥接头有什么用? 只是为了在同一个项目中使用 Objective-C 和 Swift 代码吗?”

要将一组 Objective-C 文件导入到与您的 Swift 代码相同的应用程序目标中,您需要依靠 Objective-C 桥接头将这些文件公开给 Swift。当您将 Swift 文件添加到现有的 Objective-C 应用程序或将 Objective-C 文件添加到现有的 Swift 应用程序时,Xcode 会提供创建此头文件的功能。

这个问题的答案是肯定的。它只是为了让 Swift 和 Objective-C 在同一个项目中协同工作。

"我们应该避免使用桥接头吗?比如说,如果有两个非常相似的第三方库;一个在 Objective-C 中,另一个在 Swift 中。我们应该使用 Swift 库还是使用 Objective-C库。使用桥接头有什么缺点吗?"

总会有取舍。对此的第一个答案是否定的,您不应该避免使用桥接头;但是,就第三方库而言,您必须考虑许多因素。哪个功能更多?是否经常维护和/或添加?

使用 Objective-C 库还会添加一些需要注意和解决的问题。从书中:

疑难解答提示和提醒

将 Swift 和 Objective-C 文件视为同一个代码集合,并注意命名冲突。
如果您正在使用框架,请确保打包下的定义模块 (DEFINES_MODULE) 构建设置设置为“是”。
如果您使用的是 Objective-C 桥接头,请确保 Swift 编译器 - 代码生成下的 Objective-C 桥接头 (SWIFT_OBJC_BRIDGING_HEADER) 构建设置设置为相对于您的项目的桥接头文件的路径(例如, “MyApp/MyApp-Bridging-Header.h”)。
Xcode 使用您的产品模块名称 (PRODUCT_MODULE_NAME) — 而不是您的目标名称 (TARGET_NAME) — 在为您的 Swift 代码命名 Objective-C 桥接头和生成的标头时。有关产品模块命名的信息,请参阅命名您的产品模块。
要在 Objective-C 中访问和使用,Swift 类必须是 Objective-C 类的后代,或者必须标记为 @objc。
当您将 Swift 代码引入 Objective-C 时,请记住,Objective-C 将无法翻译特定于 Swift 的某些功能。有关列表,请参阅在 Objective-C 中使用 Swift。
如果您在 Swift 代码中使用自己的 Objective-C 类型,请确保在将 Swift 生成的标头导入要从中使用 Swift 代码的 Objective-C .m 文件之前为这些类型导入 Objective-C 标头。 标有 private 修饰符的 Swift 声明不会出现在生成的标头中。私有声明不会暴露给 Objective-C,除非它们也明确地用 @IBAction、@IBOutlet 或 @objc 标记。
对于应用目标,如果应用目标具有 Objective-C 桥接头标头,则标有内部修饰符的声明会出现在生成的标头中。
对于框架目标,只有带有 public 修饰符的声明才会出现在生成的标头中。您仍然可以在框架的 Objective-C 部分中使用标记为 internal 修饰符的 Swift 方法和属性,只要它们是在从 Objective-C 类继承的类中声明的。有关访问级别修饰符的更多信息,请参阅 Swift 编程语言 (Swift 2.2) 中的访问控制。

【讨论】:

  • 在这部分:“如果您正在使用 Objective-C 桥接头,请确保使用 Objective-C 桥接头”我只想让每个人检查 Xcode 实际放置文件的位置手动添加。我花了一些非常困惑的时间试图弄清楚为什么 Xcode 中的 Group 中的标头找不到,只是得知它被物理地自动放置在不同的文件夹中。
【解决方案2】:

问:桥接头有什么用?

说得对,桥接头允许用户在同一个项目的 swift 代码中使用 Objective-C 类/文件。

Swift 桥接头允许您通过 Swift 类与旧的 Objective-C 类进行通信。如果您打算将部分代码库保留在 Objective-C 中,您将需要一个。应该注意的是,即使您决定将所有代码转换为 Swift,您可能使用的某些类或库(例如 SVProgressHUD)也没有在 Swift 中重写,您需要使用桥接头来使用它们。

问:我们应该避免使用桥接头吗?

考虑到您的问题,有两种可能的情况。

案例 1: 假设您的项目是用 Objective-C 开发的,现在您正在使用 swift 开发新功能,在这种情况下,您必须拥有BridgingHeader,因为您需要访问快速代码中的 Objective-C 类。

案例 2: 如果您的项目是在 swift 中开发的,则不需要桥接头,如果它仅在 Objective-C 中并且您不打算在 swift 中移动它你也不需要它。

在苹果文档中了解更多关于 Using swift with cocoa and Objective-C 的信息。

以下苹果文档图片表示使用了桥接头

【讨论】:

    【解决方案3】:

    不,在您的 Swift 项目中使用 Obj-c 代码没有任何缺点。桥接头仅将您的 Obj-c 文件公开给 Swift。这两种语言可以毫无问题地共存于同一个项目中,因为您也可以轻松地将 Swift 代码暴露给 Obj-c - xCode 将为您的所有公共 Swift 声明生成一个标头。尽管一切皆有可能,但如果您开始一个新项目,您应该坚持使用一种语言,以便项目更容易理解。例如,如果你决定使用 Swift,你应该只将 Obj-c 用于 Swift 中不可用的库。

    【讨论】:

      【解决方案4】:

      桥接头允许在同一个项目中使用 Swift 和 Objective-C。在您的项目中使用桥接头没有缺点,因为这两种语言可以在同一个应用程序中很好地协同工作。

      在添加桥接头后从项目中删除它可能会导致错误,因为它在创建时在项目的其他地方被引用。

      如果您只打算使用两种语言中的一种,则不需要桥接头。另一方面,如果您同时使用 Swift 和 Objective-C,则需要一个桥接头并且不会导致任何问题。

      这里有一个链接可以找到有关该主题的更多信息:

      https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

      我希望这回答了你的问题。祝你的项目好运!

      【讨论】:

        【解决方案5】:

        桥接头有什么用?

        • 您已经得到了答案。你是对的。

        我们应该避免使用桥接头吗?

        • 没有。当第三方库在 Obj-C 中开发并且可能在 Swift 中尚不可用时,这很好。您应该使用桥接头来为您的应用提供最佳库。

        • 这取决于您选择哪个。在联网的情况下?如果你的项目是基于 Obj-C 的,你可以使用AFNetworking,或者对于 Swift,你可以使用AlamoFire,你仍然可以在 Swift 中使用AFNetworking,但不建议使用。

        【讨论】:

          【解决方案6】:

          桥接头是将 Objective-C 代码引入 Swift 项目的好方法。如果您有两个库,一个在 Swift 中,一个在 Objective-C 中,请选择一个可以在您的应用程序中提供更多功能的库。如果它们提供相同的功能,我会选择 Swift 库 -> 我的理由:如果 Objective-C 库没有被广泛使用并且没有太多关于如何将 Objective-C 代码转换为 Swift 的教程,自行解决可能非常耗时。如果您使用 Swift 库,则代码已经以正确的语言格式化,从而节省您的时间和潜在的金钱(取决于这是否是您的爱好)。至于使用桥接头的任何缺点,它们真的不是!有这么多用 Objective-C 编写的库,您几乎需要在应用程序中添加一个桥接头。以 Reachability 为例(Here 是有关 Swift 实现的视频)。这是 Apple 创建的一个库,用于处理应用程序中的网络中断。这对于开发人员来说是一个很棒的工具,并且需要一个桥接头。 Here 是一个很棒的 YouTube 视频,介绍了如何使用桥接头,但是如果你将头文件添加到 Swift 文件中,Xcode 通常会要求为你创建一个。希望这会有所帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-03
            • 2015-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多