【问题标题】:How to import a Swift framework globally?如何全局导入 Swift 框架?
【发布时间】:2015-11-01 08:08:36
【问题描述】:

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

我尝试了很多东西,但都没有奏效。以下是一些我没有尝试过的方法,我认为如果找到一种方法可以使用它们:

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

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

【问题讨论】:

  • 是的,使用桥接头。此问题可能与此问题重复:stackoverflow.com/questions/30162622/…
  • 实际上显然这个答案从未被接受,所以这可能行不通......我认为答案可能是你不能迅速做到这一点。抱歉,您需要导入到使用该框架的每个文件。
  • OP,是什么阻止您接受答案? @prolfe 不幸的是,没有办法解决这个问题,这是一个好方法 - 代码仅在需要的地方可用,因此它可以更快地编译/运行所有内容
  • 人们对这个问题很感兴趣,我仍然认为/希望有某种黑客手段来获得这种行为。

标签: ios swift


【解决方案1】:

您应该可以通过在导入前添加@_exported 来全局导入它。

@_exported import Podname

但是,就像之前提到的海报一样,不建议这样做。

【讨论】:

  • 但是我怎样才能在项目中写...比如 appdelegate 或 anyview 控制器
  • @christoffer 为什么不推荐这样做?请解释
  • 引用之前的海报“在 Swift 中强烈建议不要这样做,因为这会引入模块之间的隐式耦合。” - stackoverflow.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 模块中只包含 @objcNSObject 子类;它不包括纯 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 &lt;UIKit/UIKit.h&gt; 添加到 Objective-C 桥接头文件中(这样您就不需要对每个 .swift 文件重复此操作)。

对于豆荚,您必须像 #import &lt;SwiftyJSON/SwiftyJSON-umbrella.h&gt; 那样做

【讨论】:

    【解决方案6】:

    一个你不想这样做的原因:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-02
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多