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

安库尔阿里亚

桥接头的用途是什么?

它仅用于在同一项目中使用Objective-C和Swift代码吗?

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

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

埃里克·曼特勒

苹果写了一本很棒的书,涵盖了这方面的内容。在这里能找到它:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以/应该有多个Objective-C桥接头吗?

Xcode不会自动创建桥接头吗?

为什么在Xcode 7中,我的桥接头仍然出现此错误:桥接头不存在?

删除桥接头步骤

导入桥接头失败

桥接头方法参数问题

无法导入桥接头 - Swift

如果使用Cocoapods和use_frameworks !,是否应该使用Obj-C桥接头?

使用Swift使用桥接头构建可重用的库

在RHEL中配置软件桥的目的是什么?我们如何在虚拟化中使用它?

预期类型&导入桥接头失败

用于Obj-C的Swift桥接头

找不到CocoaPods桥接头文件

如何避免桥接头中的“重新定义”和“重复协议”定义错误

触发器的用途是什么,谁能举例说明我们应该在哪里使用?

为什么在Swift项目中需要Objective-C桥接头?

尝试在带有桥接头的Swift项目中尝试使用Objective-C库

如何使用桥接头将Objective-C cocoapod导入Swift

在不使用桥接头的情况下访问私有UIKit函数

如何在没有桥接头的情况下在 Swift 中使用 Objective-C 框架?

使用swift和objective-c桥接头文件和框架的命名空间冲突

添加使用swift类的目标c类来桥接头文件Projectname_swift.h

Swift-桥接头失败。“ *”没有名为“ *”的成员

目标 C 中的桥接头 - 程序中出现意外的“@”

Xcode 在加载框架时找不到桥接头

在创建NSManaged子类时停止Swift桥接头

没有在Xcode中添加UITests桥接头文件

Xcode - 桥接头的 Swift 编译器错误

如何创建一个Objective-C桥接头?