【问题标题】:How to make a Swift framework submodule really private?如何使 Swift 框架子模块真正私有?
【发布时间】:2017-01-10 14:50:56
【问题描述】:

我发现了另一个问题,它提供了有关问题和可能解决方案的更多详细信息。似乎有一个已知的错误是未来改进的主题。

Objective C classes within an iOS Swift-based dynamic framework

我正在用 Swift 开发一个框架,并且在框架内使用了一些 Objective-C 代码。到目前为止,我的模块图如下所示:

framework module MyModule {
    umbrella header "MyModule-umbrella.h"

    export *

    explicit module Private {
        header "MyTools.h"
    }
}

我担心MyTools.h 中的所有 API 在框架外部都是可见的:例如,如果您使用 Cocoapods 安装框架,那么您将 import MyModule 到您的应用程序中(不是 MyModule.Private),您可以访问MyTools.h,这是不可取的和多余的。有什么方法可以让 MyTools 在框架之外不可见?

PS。我使用 Cocoapods 分发框架,这是我的 podspec(最重要的部分):

s.module_map    = 'Pod/MyModule.modulemap'
s.frameworks    = 'CoreData', 'CoreTelephony', 'SystemConfiguration'
s.resources     = 'Pod/Classes/MessageStorage/*.xcdatamodeld'
s.public_header_files = 'Pod/Classes/**/*.h'
s.private_header_files = 'Pod/Classes/MyTools/**/*.h'
s.source_files  = 'Pod/Classes/**/*.{h,m,swift}'

PSS。我的伞头不导入MyTools.h

PSSS。只是试图从主模块中排除标题:

framework module MyModule {
    umbrella header "MyModule-umbrella.h"

    export *
    exclude header "MyTools.h"

    explicit module Private {
        header "MyTools.h"
    }
}

运气不好。

【问题讨论】:

  • 您是否尝试过 exclude 来自模块的私有标头?
  • @user28434 你的意思是在模块映射中?刚试了一下。没用。
  • 你可以再试一次,但没有explicit module
  • @user28434 如果我删除模块声明,那么我将如何使用 swift 框架中的 Objective-c 源代码?
  • @user28434 我之前试过了。不能解决问题,这对我来说很明显。

标签: swift module frameworks cocoapods access-control


【解决方案1】:

我发现了另一个问题,它提供了有关问题和可能解决方案的更多详细信息(虽然不起作用)。似乎有一个已知的错误是未来改进的主题。

Objective C classes within an iOS Swift-based dynamic framework

【讨论】:

    【解决方案2】:

    我最近遇到了完全相同的问题。 快速回答是您不能:) 即使您声明“私有”模块映射,您的框架用户也可以始终导入它。请注意,这通常不是问题,尤其是开源。你只是说“这是一个内部模块,不要使用它”。

    但是(总是有但是)——你可以有行为,有效地工作相同——允许你在相同的框架目标中使用你的 Objective-C 类,而不会将它们公开。它适用于闭源设置,我不能 100% 确定它在 pod 中的表现如何。

    案例有点过于复杂,无法在此处粘贴所有内容。我正在为我的文章添加一个关于该主题的链接,也许它会对你有所帮助。但老实说 - 在您的设置中可能会有一些开销。

    Creating Swift framework with private Objective-C members. The Good, the Bad, and the Ugly

    Github example project

    【讨论】:

    猜你喜欢
    • 2015-05-19
    • 2020-05-15
    • 2016-03-19
    • 2016-05-27
    • 2015-04-29
    • 2019-04-04
    • 2019-12-31
    • 2016-02-18
    • 2016-05-25
    相关资源
    最近更新 更多