如何在全球范围内导入Swift框架



我想有一种方法在每个类中全局导入我的Swift Cocoapods,我该如何实现?

我尝试了很多东西,但都不起作用。以下是一些我没有尝试过的方法,如果找到一种方法,这些方法可能是可行的:

有一个像UIKit这样的通用导入语句,并将所有内容都放在那里。(编辑:此操作失败)

不知何故,将Swift框架放在Obj-C桥接头中,并将其导入其中。

您应该能够通过在导入之前添加@_exported来全局导入它。

@_exported import MyPodModuleName

然而,就像其他答案提到的那样,不建议对整个模块这样做,因为这会引入模块之间的隐式耦合。

因此,请尝试以下方法:

import Foundation
@_exported import class MyModuleName.MyClassName
@_exported import class MyModuleName.MyOtherClass

Swift中强烈反对这样做,因为这会在模块之间引入隐式耦合。

但是,您可以通过在导入另一个模块的模块中声明typealias来使某个符号全局可用:

import ModuleName
public typealias ClassName = ModuleName.ClassName

截至Swift4:

  • 参与Swift项目
  • 想在全球范围内拥有另一个Swift项目进口(并使用椰子)

我只是设法做到了这一点,在我的桥接标头中添加了以下行:

#import <PodName/PodName-Swift.h>

这种做法有多好/有多坏?不确定,但我只是想在我的项目中提供一些全球可用的扩展。这就成功了。

没有方法可以做到这一点。这不是一个bug,这是一个语言功能(到目前为止,就Swift 2.2而言)

Swift使用模块(苹果在Objective-C的Xcode 5中引入了这些模块),每个文件都是一个语义单元,因此您需要明确通知Xcode哪些模块暴露在定义的文件中。

不仅不支持您描述的行为,而且您也不应该试图绕过它。使用不必要的(未使用的)模块理论上可能会产生较慢的代码(考虑到编译器在优化过程中使用了这些信息)。

您可以通过以下方式手动实现相同的功能:

  • 创建Objective-C桥接头文件
  • #import <UIKit/UIKit.h>添加到Objective-C桥接头文件中(这样就不需要对每个.swift文件重复此操作)

对于像#import <SwiftyJSON/SwiftyJSON-umbrella.h> 这样的pod,

不想这样做的原因:

想象一下,如果您的两个框架都使用相同的方法名,这将使编译器产生歧义。编译器不知道应该运行哪种方法。

要了解更多信息,请参阅此问题

最新更新