什么是桥接头的作用?我们是否应该避免使用桥接头?

8

桥接头的作用是什么?

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

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

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


如果你选择使用Swift语言来开发项目,并且想要在同一个项目中使用一些Objective-C文件,那么你需要使用桥接头文件,反之亦然。 - vikash1307
6个回答

9

苹果公司已经撰写了一本深入讲解此问题的好书。可以在这里找到:

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

我会引用它来回答你的问题:
“桥接头的作用是什么? 它只是为了在同一项目中使用Objective-C和Swift代码吗?”
要在与您的Swift代码相同的应用程序目标中导入一组Objective-C文件,您需要依靠Objective-C桥接头将这些文件公开给Swift。当您向现有的Objective-C应用程序添加Swift文件或向现有的Swift应用程序添加Objective-C文件时,Xcode会提供创建此头文件的选项。
对于这个问题的答案是肯定的。它只是让Swift和Objective-C在同一个项目中一起工作。
“我们应该避免使用桥接头吗?比如说,如果有两个非常相似的第三方库;其中一个是Objective-C,另一个是Swift。我们应该使用Swift库还是使用Objective-C库。使用桥接头有什么缺点吗?”
总是存在权衡。对于这个问题的第一个答案是否定的,您不应该避免使用桥接头; 但是,对于第三方库,您必须考虑许多因素。哪一个具有更多的功能?它是否经常维护和/或添加?
使用Objective-C库也会增加需要注意和解决的事情。从书中可以看出:

故障排除提示和提醒

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


在这个部分上:“如果你正在使用Objective-C桥接头,请确保Objective-C桥接头”,我只想让每个人检查一下,如果您手动添加文件,Xcode实际上放置了文件在哪里。我花了很长时间感到困惑,试图弄清楚为什么Xcode中的组中的标头找不到,只学习它被自动地放置在不同的文件夹中。 - Maury Markowitz

3

问题: Bridging header 的用途是什么?

可以这样说,Bridging header 允许用户在同一项目的 Swift 代码中使用 Objective-C 类/文件。

Swift bridging header 允许您从 Swift 类与旧的 Objective-C 类进行通信。如果您计划在 Objective-C 中保留部分代码库,则需要它。应该注意的是,即使您决定将所有代码转换为 Swift ,某些类或库(例如 SVProgressHUD)并未在 Swift 中重写,您需要使用 Bridging header 才能使用它们。

问题: 我们应该避免使用 Bridging header 吗?

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

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

情况2:如果您的项目是用 Swift 开发的,则不需要 Bridging header;如果它仅限于 Objective-C,并且您不打算将其移动到 Swift,则也不需要它。

在苹果文档中了解有关将 Swift 与 Cocoa 和 Objective-C 结合使用的更多信息。

下面的苹果文档图像显示了 Bridging header 的使用方式 Bridging header usage


2

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


2
桥接头文件允许在同一项目中使用Swift和Objective-C。在项目中添加桥接头文件没有任何不利影响,因为这两种语言可以很好地在同一个应用程序中协同工作。
如果在创建后从项目中删除桥接头文件,可能会导致错误,因为在创建时它被引用到了项目的其他位置。
如果你只打算使用其中一种语言,则桥接头文件是不必要的。另一方面,如果你同时使用Swift和Objective-C,则需要桥接头文件,并且不会引起任何问题。
这里有一个链接,可以找到更多关于此主题的信息:

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

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

1

什么是桥接头的用途?

  • 你已经得到了答案。你是正确的。

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

  • 不需要。当第三方库是用Obj-C开发的,而Swift还没有相应的库时,你应该使用桥接头来为你的应用程序提供最好的库。

  • 这取决于你选择哪个库。在网络方面的情况下?如果你的项目是基于Obj-C的,你可以使用AFNetworking,如果是Swift,则可以使用AlamoFire,你仍然可以在Swift中使用AFNetworking,但这并不建议。


1

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接