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

时间:2016-04-06 05:08:37

标签: objective-c swift bridging-header

桥接标题的用途是什么?

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

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

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

6 个答案:

答案 0 :(得分:9)

Apple写了一本很好的书,深入介绍了这一点。它可以在这里找到:

  

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

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

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

  

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

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

“我们应该避免使用桥接头吗?假设,如果有两个非常相似的第三方库;其中一个在Objective-C中,另一个在Swift中。我们应该使用Swift库还是使用Objective-C库。使用桥接头是否有任何缺点?“

总是有权衡。对此的第一个答案是,你不应该避免使用桥接头;但是,就第三方图书馆而言,你必须考虑很多因素。哪一个有更多功能?它是否经常被维护和/或添加?

使用Objective-C库还会添加需要注意和解决的事项。从书中可以看出:

  

故障排除提示和提醒

     

将Swift和Objective-C文件视为相同的代码集合,并注意命名冲突   如果您正在使用框架,请确保将Packaging下的Defines Module(DEFINES_MODULE)构建设置设置为“Yes”。
  如果您正在使用Objective-C桥接头,请确保Swift Compiler - Code Generation下的Objective-C桥接头(SWIFT_OBJC_BRIDGING_HEADER)构建设置设置为相对于项目的桥接头文件的路径(例如, “MyApp的/ MyApp的桥接-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,@ IBMOutlet或@objc。
  对于应用程序目标,如果应用程序目标具有Objective-C桥接标题,则使用内部修饰符标记的声明将显示在生成的标题中。
  对于框架目标,仅在生成的标头中显示带有public修饰符的声明。您仍然可以在框架的Objective-C部分中使用使用内部修饰符标记的Swift方法和属性,只要它们在从Objective-C类继承的类中声明即可。有关访问级别修饰符的更多信息,请参阅Swift编程语言中的访问控制(Swift 2.2)。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

问:桥接标头的用途是什么?

正确的说法是,Bridging标头允许用户在同一个项目的swift代码中使用Objective-C类/文件。

  

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

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

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

案例1:让我们说你的项目是用Objective-C开发的,现在你正在开发使用swift的新功能,在这种情况下你必须根据需要设置BridgingHeader使用swift代码访问Objective-C类。

案例2:如果您的项目是在swift中开发的,那么就没有必要使用Bridging标头,如果它只在Objective-C中,并且您不打算在swift中移动它你也不需要它。

在Apple文档中阅读有关Using swift with cocoa and Objective-C的更多信息。

以下Apple文档图像表示使用Bridging标头 Bridging header usage

答案 3 :(得分:2)

  

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

在项目添加 之后从项目中删除桥接标题可能会导致错误 ,因为项目创建时会在项目的其他位置引用它。

  

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

以下链接可找到有关该主题的更多信息:

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

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

答案 4 :(得分:1)

  

桥接头的用途是什么?

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

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

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

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

答案 5 :(得分:1)

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