桥接标题的用途是什么?
是否只是在同一个项目中使用Objective-C和Swift代码?
我们应该避免使用桥接标头吗?
说,如果有两个非常相似的第三方库;其中一个在Objective-C中,另一个在Swift中。我们应该使用Swift库还是使用Objective-C库。使用桥接头是否有任何缺点?
答案 0 :(得分:9)
我会引用它来回答你的问题:
“桥接头有什么用? 它只是在同一个项目中使用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的更多信息。
答案 3 :(得分:2)
桥接头允许在同一个项目中使用Swift和Objective-C。在项目中使用桥接标头没有任何缺点,因为这两种语言可以在同一个应用程序中很好地协同工作。
在项目添加 之后从项目中删除桥接标题可能会导致错误 ,因为项目创建时会在项目的其他位置引用它。
如果您只打算使用两种语言中的一种,则不需要桥接标头。另一方面,如果您同时使用Swift和Objective-C,则需要桥接头并且不会导致任何问题。
以下链接可找到有关该主题的更多信息:
我希望能回答你的问题。祝你的项目好运!
答案 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通常会要求为您创建一个。希望这有帮助!