桥接头的用途是什么?
它仅用于在同一项目中使用Objective-C和Swift代码吗?
我们应该避免使用桥接头吗?
假设有两个非常相似的第三方库;其中之一是在Objective-C中,另一个是在Swift中。我们应该使用Swift库还是使用Objective-C库。使用桥接标头有什么缺点吗?
苹果写了一本很棒的书,涵盖了这方面的内容。在这里能找到它:
我将引用它来回答您的问题:
“桥接头的用途是什么?仅用于在同一项目中使用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] 删除。
我来说两句