如何全局导入 Swift 框架?
Posted
技术标签:
【中文标题】如何全局导入 Swift 框架?【英文标题】:How to import a Swift framework globally? 【发布时间】:2015-11-01 08:08:36 【问题描述】:我想有一种方法可以在每个班级中全局导入我的 Swift Cocoapods,我该如何实现?
我尝试了很多东西,但都没有奏效。以下是一些我没有尝试过的方法,我认为如果找到一种方法可以使用它们:
有一个像 UIKit 这样的通用导入语句并将所有内容都放在那里。 (编辑:这失败了)
不知何故将 Swift 框架放在 Obj-C 桥接头中并在其中导入内容。
【问题讨论】:
是的,使用桥接头。此问题可能与此问题重复:***.com/questions/30162622/… 实际上显然这个答案从未被接受,所以这可能行不通......我认为答案可能是你不能迅速做到这一点。抱歉,您需要导入到使用该框架的每个文件。 OP,是什么阻止您接受答案? @prolfe 不幸的是,没有办法解决这个问题,这是一个好方法 - 代码仅在需要的地方可用,因此它可以更快地编译/运行所有内容 人们对这个问题很感兴趣,我仍然认为/希望有某种黑客手段来获得这种行为。 【参考方案1】:您应该可以通过在导入前添加@_exported 来全局导入它。
@_exported import Podname
但是,就像之前提到的海报一样,不建议这样做。
【讨论】:
但是我怎样才能在项目中写...比如 appdelegate 或 anyview 控制器 @christoffer 为什么不推荐这样做?请解释 引用之前的海报“在 Swift 中强烈建议不要这样做,因为这会引入模块之间的隐式耦合。” - ***.com/users/5448100/igor-makarov 谢谢各位,这个sintax也可以和SPM一起使用。好男人:D【参考方案2】:在 Swift 中强烈建议不要这样做,因为这会引入模块之间的隐式耦合。
但是,您可以通过在导入另一个模块的模块中声明 typealias
来使某个符号全局可用:
import ModuleName
public typealias ClassName = ModuleName.ClassName
【讨论】:
100% 松散耦合的组件只存在于理论上。整个项目中总是存在一些全局库依赖项。例如,具有日志级别的自定义记录器就是一个很好的例子。因此 typealias 非常适合这种情况。【参考方案3】:从 Swift4 开始:
参与 Swift 项目 想在全球范围内拥有另一个 Swift 项目 导入(并使用 cocoapods)我只是通过在我的桥接头中添加以下行来做到这一点:
#import <PodName/PodName-Swift.h>
这种做法的好坏程度如何?不确定,但我只想在我的项目中全局使用一些扩展。这成功了。
【讨论】:
有趣的“hack”在桥接头中导入自动生成的.h。但是有一个限制,因为 .h 在 Swift 模块中只包含@objc
和 NSObject
子类;它不包括纯 Swift 的东西。【参考方案4】:
没有方法可以做到这一点。这不是一个错误,这是一个语言特性(到目前为止,就 Swift 2.2 而言)。
Swift 使用模块(Apple 在 Xcode 5 for Objective-C 中引入了它们)并且每个文件都是一个语义单元,因此您需要明确告知 Xcode 哪些模块暴露给定义的文件。
不仅不支持您描述的行为,而且您也不应该尝试绕过它。从理论上讲,使用不必要的(未使用的)模块可能会产生较慢的代码(考虑到编译器在其优化过程中使用此信息)。
【讨论】:
此外(或“随机”),Xcode 可能会神奇地了解您的 Swift 文件框架之一,但 AppCode 会完全混乱。您需要对框架客户端中的每个 Swift 文件执行import
。
@Krodak 你碰巧有一个提到这个的苹果链接吗?我非常同意你的观点,但我真的很想从苹果那里得到某种形式的暗示。谢谢。【参考方案5】:
您可以通过以下方式手动实现相同的功能:
创建Objective-C Bridging Header file; 将#import <UIKit/UIKit.h>
添加到 Objective-C 桥接头文件中(这样您就不需要对每个 .swift 文件重复此操作)。
对于豆荚,您必须像 #import <SwiftyJSON/SwiftyJSON-umbrella.h>
那样做
【讨论】:
【参考方案6】:一个你不想这样做的原因:
想象一下,如果您的两个框架都使用相同的方法名称,这会使编译器产生歧义。编译器将不知道应该运行哪个方法。
要了解更多信息,请参阅this 问题
【讨论】:
以上是关于如何全局导入 Swift 框架?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Objective C 静态库导入 Swift 框架?
如何将用 Swift 编写的 Cocoa Touch 框架导入 .pch 文件?
如何在同一框架内访问 Objective-C 中的内部 Swift 类?