桥接头的作用是什么?
它只是为了在同一项目中使用Objective-C和Swift代码吗?
我们应该避免使用桥接头吗?
假设有两个非常相似的第三方库,一个是Objective-C,另一个是Swift。我们应该使用Swift库还是使用Objective-C库?使用桥接头有什么缺点吗?
桥接头的作用是什么?
它只是为了在同一项目中使用Objective-C和Swift代码吗?
我们应该避免使用桥接头吗?
假设有两个非常相似的第三方库,一个是Objective-C,另一个是Swift。我们应该使用Swift库还是使用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)》中的“访问控制”。
问题: 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 结合使用的更多信息。
在您的Swift项目中使用Obj-c代码没有任何缺点。桥接头文件仅将您的Obj-c文件暴露给Swift。这两种语言可以在同一个项目中共存,没有任何问题,因为您也可以轻松地将您的Swift代码暴露给Obj-c - xCode将为所有公共Swift声明生成一个头文件。虽然一切皆有可能,但如果您开始一个新项目,应该坚持使用一种语言,以便更容易理解项目。例如,如果您决定使用Swift,则应仅在不可用于Swift的库中使用Obj-c。
什么是桥接头的用途?
我们应该避免使用桥接头吗?
不需要。当第三方库是用Obj-C开发的,而Swift还没有相应的库时,你应该使用桥接头来为你的应用程序提供最好的库。
这取决于你选择哪个库。在网络方面的情况下?如果你的项目是基于Obj-C的,你可以使用AFNetworking
,如果是Swift,则可以使用AlamoFire
,你仍然可以在Swift中使用AFNetworking
,但这并不建议。