【问题标题】:Expose Classes of Dependencies in Swift Framework在 Swift 框架中公开依赖类
【发布时间】:2016-01-20 05:35:06
【问题描述】:

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

MyFramework 依赖于CoreFramework,并在其公共方法中使用CoreFramework 的一些类、结构和枚举,例如:

public func fetchData() -> CoreStruct

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

let result = fetchData()

当我 alt+click 变量时,这会编译,Xcode 甚至会为我提供正确的类型,但如果我想像这样显式指定 result 的类型:

let result: CoreStruct = fetchData()

我得到一个编译器错误,我必须导入 CoreFramework

我必须做什么,才能在我的项目中明确使用CoreStruct 之类的东西,而无需导入底层框架?

【问题讨论】:

  • 我不知道 cocoapod 是如何工作的,但是没有它,你通常会像 core dara、foundation 等那样对框架使用“import”指令。你可以用 Cocoapods 省略这个吗?
  • 但是即使我要导入让我们说CoreData,我是否可以在项目中使用NSManagedObject 之类的东西而无需额外导入?我猜不是
  • 不在项目范围内,你是对的。除非你在主文件中这样做。

标签: ios swift cocoapods


【解决方案1】:

您可以在MyFramework 中从底层CoreFramework 公开您需要的类

public typealias CoreStruct = CoreFramework.CoreStruct

【讨论】:

    【解决方案2】:

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

    有一种叫做“伞形框架”的东西有点可以通过让您为多个子框架创建外观来满足您的需求,但 Apple specifically discourages you from creating one

    除此之外,您必须确保(在您的示例中)fetchData()CoreStruct 被编译到同一个框架中,您可以这样做:

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

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

    【讨论】:

    • 感谢您的回答。您能否详细说明“让 MyFramework 使用 Cocoapods 将 CoreFramework 构建到同一个工作区中”部分?
    • 查看编辑。它基本上只是一种合并代码库的奇特方式,仅当您有理由独立于 MyFramework 发布/使用 CoreFramework 时才有用。
    • 好吧,虽然我不能在我的特殊情况下使用它,但这仍然是一个很好且有效的答案。希望它可以帮助一些人
    【解决方案3】:

    你可以的

    import struct CoreFramework.CoreStruct
    

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

    【讨论】:

    • 但这意味着我仍然需要导入它。我首先想避免对CoreFramework 的任何导入
    • 正如你所看到的“公认的答案”,没有办法这样做,下一个最好的办法是避免导入整个框架,这可能会污染你的命名空间。
    猜你喜欢
    • 2017-10-11
    • 2015-05-21
    • 2015-04-19
    • 2017-12-24
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 2017-10-26
    • 2018-12-05
    相关资源
    最近更新 更多