在 Swift 框架中公开 类 个依赖关系

Expose Classes of Dependencies in Swift Framework

我在swift中构建了两个框架,我们称它们为CoreFrameworkMyFramework

MyFramework 依赖于 CoreFramework 并在其 public 方法中使用了 CoreFramework 的一些 类、结构和枚举,如下所示例如:

public func fetchData() -> CoreStruct

我已经为两个框架设置了一个 podspec,我可以在我的项目中使用 MyFramework 作为一个 pod。在我的项目中,我会这样写:

let result = fetchData()

这编译并且 Xcode 甚至在我 alt+click 变量时给我正确的类型,但是如果我想像这样明确指定 result 的类型:

let result: CoreStruct = fetchData()

我遇到编译器错误,我必须导入 CoreFramework

我需要做什么才能在我的项目中显式使用 CoreStruct 之类的东西,而不必导入底层框架?

你可以

import struct CoreFramework.CoreStruct

要仅导入此特定类型,请参阅 The Swift Programming Language Reference: Import Declarations

Swift 中无法使导入一个模块自动导入另一个模块。这是语言设计者有意识的选择,Swift 对此很严格。

有一种叫做“伞形框架”的东西,有点 通过让你为几个子框架创建外观来做你想做的事,但 Apple specifically discourages you from creating one

除此之外,您必须确保(在您的示例中)fetchData()CoreStruct 被编译到同一框架中,您可以通过以下方式完成:

  • MyFramework 包含 CoreFramework 的代码作为 git 子模块,
  • MyFramework 使用 Cocoapods 在同一个工作区内构建 CoreFramework(即将 CoreFramework 作为 pod 发布,并将其包含在 MyFramework 在 podfile 中没有 use_frameworks 选项,这样你就可以在一个工作区中将两个项目编译到一个框架中),
  • 合并项目(即将 MyFrameworkCoreFramework 中的所有源文件添加到同一个项目),

...或任何其他导致将两个源代码树编译到一个框架中的东西。

您可以从 MyFramework

中的底层 CoreFramework 公开您需要的 类
public typealias CoreStruct = CoreFramework.CoreStruct