【问题标题】:How to mix Swift and Objective-C in a pod lib?如何在 pod lib 中混合使用 Swift 和 Objective-C?
【发布时间】:2015-09-08 13:54:11
【问题描述】:

我使用以下命令创建了一个新的 swift lib pod:pod lib create MixSwiftObjectiveC found from https://guides.cocoapods.org/making/using-pod-lib-create.html

在这个 pod 库中,我需要使用用 Objective-C 编写的代码。 如果我有一个单独的“正常”项目,我只需将导入包含在头文件中……-Bridging-Header.h。 pod lib是否有等价物? Swift 和 Objective-C 可以在一个 pod 库中混合使用吗?

作为一个例子,我创建了这个 github:https://github.com/crarau/MixSwiftObjectiveC 为了运行示例,您需要 XCode 7.0 beta 6 和 Swift 2.0

感谢您的帮助!

【问题讨论】:

  • 刚刚遇到这个问题,现在有更新吗?
  • 不幸的是,我不得不走在 Pod Lib 中不混合两种语言的路线。
  • 太伤心了...我有一个用 objc 编写的私有 pod 库,它大到不可能一次用 Swift 重写。我现在也必须使用 objc。

标签: objective-c cocoapods swift2


【解决方案1】:

我确认了一个可行的解决方案,它是这样工作的:

  1. 只能是 iOS 8+(当然...)
  2. 使用 Xcode 创建 Cocoa Touch 框架
  3. 开发框架,随意混合swift代码和objc代码。确保将所有需要公开的 swift 类标记为 public。您可能需要咨询documentation
  4. 创建一个 podspec 文件,提供必要的信息(请参阅here 了解 pod 的外观)。特别是您需要在 podspec 文件的 source_files 中包含 Umbrella Header(在您的框架中用于将 objc 代码公开给 swift)。当你创建一个框架项目时,Xcode 会自动为你的框架创建一个伞头文件。如果您的框架名称为NVMDummy,则标头为NVMDummy.h
  5. 推送 pod 并将 pod 作为框架集成到您的项目中。
  6. 测试您的 pod 库。我创建了一个演示应用程序,添加了我的 pod 库,并在我的 ViewController.m 中执行了以下操作:

    @import MyPodLibMixingOjbcAndSwift;
    
    // in viewDidLoad
    // use objc code in MyLib -> OK...
    // use swift code in MyLib -> OK...
    

演示应用程序有效,所以我认为它有效。

这是演示: https://github.com/axl411/TestNVMDummy

【讨论】:

  • 你能解释一下第 4 步吗?在 podspec 文件中看起来如何?您可以在示例项目中添加一个吗?干杯!
  • @adrian-schönig 编辑了我的答案。在最初确认它在我的答案中使用演示工作后,我停止了调查,因为我仍然需要支持 iOS 7 一段时间。仍有问题需要研究。我在我的演示库中记录了the issue,我们可以在那里继续讨论这个问题。
  • 谢谢!在遵循您的指示后,我仍然不断收到关于未找到我的 Swift 类的相同错误,但事实证明,我错过了文档中的重要步骤,即“确保在 Swift public 中进行您需要的操作在 Objective-C 中访问”。
  • 这成功了!谢谢!对我来说,关键是模块的 @import,现在我可以看到 Objective-c 和 swift 类
【解决方案2】:

这实际上在 cocoapod 中非常简单。您只需要在 .podspec 文件中定义这些行。

s.source_files = '{YOUR_POD}/Classes/**/*.{swift,h,m}'
s.public_header_files = '{YOUR_POD}/Classes/**/*.h'

"s.public_header_files" 自动创建一个伞形标题,该标题也用于桥接头的目的。就是这样,您应该能够在 swift 类中使用 ObjC 类。

您还可以在 ObjC 中使用 swift 类。你只需要在你的 ObjC 文件中导入 -swift 头文件。

#import <YOUR_POD/YOUR_POD-Swift.h>

只要依赖是一种方式,你就不会遇到任何问题。

【讨论】:

  • 这应该是最好的答案!
【解决方案3】:

在您的 .podspec 中,您应该有类似的内容:

s.source_files = 'MixSwiftObjectiveC/Classes/*'

  • 转到查找器中的MixSwiftObjectiveC/Classes/ 目录文件夹以确保并放置您的文件(objc 和 swift)
  • 清理构建文件夹
  • 导航到您的Example.. 文件夹并执行pod install(因为您的Example.. 文件夹下应该有一个Podfile,其中包含您的MixSwiftObjectiveC pod)
  • 构建,你不应该再有这个问题了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多