如何将 Cocoapods 与 Swift 项目集成?

随着苹果引入了他们的新编程语言 斯威夫特,我想知道如何将它与现有的通过 可可豆提供的 Objective-C 库集成在一起?

39848 次浏览

这个过程似乎与 与 Cocoa 和 Objective-C 一起使用 Swift文档的 混搭部分中描述的过程相似。

  1. 创建您的 Podfile 并运行 pod install
  2. 创建一个新的 Objective-C 头文件 Example-Bridging-Header.h,并将其添加到项目中。
  3. 将 import 语句添加到 桥头
  4. 为你的目标设置 Objective-C Bridging Header:

enter image description here

现在您可以使用您的库,在这种情况下,MKUnit,在您的 Swift 文件中:

let kilograms = NSNumber.mass_kilogram(2)()
let pounds = NSNumber.mass_pound(10)()
let result = kilograms.add(pounds)
println(result)

详情请浏览: 将 Cocoapods 与 Swift 项目集成

如果在桥接 header.h 中得到一个未找到的文件错误,那么您可能需要确保在 Build Scheme 中链接了 Pods 库。

CocoaPods 故障排除部分在项目 # 4 给你下描述了如何进行此操作

更新 : CocoaPods 0.36稳定版已经发布,它正式支持 Swift。


CocoaPods 现在在最新的0.36版本中支持 Swift,虽然还处于测试阶段,但是已经可以工作了。

首先,你需要在你的终端上运行 CocoaPods beta (目前是 beta 2)。

sudo gem install cocoapods --pre

差不多就是这样,你可以像平常一样添加 Swift 库。

但是,如果您希望通过 CocoaPods 将用 Objective-C 编写的库添加到 Swift 项目中,则存在一个问题。您需要将 use_frameworks!行添加到您的 Podfile 中。举个例子。

use_frameworks!
platform :ios, '8.0'


pod 'MagicalRecord'

关于这个我也写了一份 博客文章

现在您可以通过运行支持集成快速框架的 sudo gem install cocoapods来使用 cocoapods 0.36.0版本。当你使用 swift 编写的框架时,你应该明确地在 Podfile 使用它:

platform :ios, '8.0'
use_frameworks!
pod 'Alamofire'

Cocoapods 0.36及以上 引入了 use_frameworks!指令,这意味着在 Swift 中导入 Objective-C pods 不需要桥接头。

请参考以下使用 MBProgressHUDAlamofire的完整示例:

1. Podfile

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.3'
use_frameworks!


pod 'Alamofire', '>= 1.2.2' # Swift pod
pod 'MBProgressHUD', '>= 0.9.1' # Objective-C pod

2. 删除

删除桥接头中的 # 导入,如果不需要,甚至可以删除桥接头文件。如果选择后一种可能性,不要忘记删除 Xcode 项目配置中的路径(指向此已删除的桥接头文件)。

3. 添加导入

在每个需要这些类的 Swift 文件的顶部添加 import MBProgressHUD和/或 import Alamofire

4. 必要时固定枚举

您现在使用的是真正的框架,所以您的枚举已经在飞行中移动了!您可能有一行 Swift,它的桥接头部是这样的:

progressHUD.mode = MBProgressHUDModeIndeterminate

现在必须变成这样:

progressHUD.mode = MBProgressHUDMode.Indeterminate

这没什么大不了的,但是如果使用了大量 Objective-C 枚举,那么这一堆错误可能会让您误入歧途,以为自己遇到了比实际情况更严重的问题。

(这个答案的来源)

供您参考: 我想(您必须自己测试才能确定) use _ Framework!Podfile 中的指令仅与针对 iOS > = 8的 Xcode 项目兼容。

在我的例子中,我发现我并没有向 main target 添加 pods,而只是向 Podfile 的 Test 和 TestUI 目标添加 pods,正如 给你所解释的那样。