自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在 Swift 中使用 CocoaPods

移動開發(fā) iOS
本文介紹如何在 Swift 項目中使用 CocoaPods 。如果你已經(jīng)精通 Bridging Header 的方法,請直接跳到 “擴展 CocoaPods” 一節(jié)。

本文介紹如何在 Swift 項目中使用 CocoaPods 。如果你已經(jīng)精通 Bridging Header 的方法,請直接跳到 “擴展 CocoaPods” 一節(jié)。

什么是 CocoaPods

CocoaPods is the dependency manager for Objective-C projects. It has thousands of libraries and can help you scale your projects elegantly. 

從介紹看,它是主要給 Objective-C 項目用的,但是我們可以很容易地混合 Objective-C 和 Swift 到同個項目,從而利用大量的 CocoaPods 庫和 Swift 漂亮舒服的語法。

作為 iOS 開發(fā)新手,一定是要緊跟前人腳步,學習使用 CocoaPods 。

基礎用法

這里簡單略過,請參考其他無數(shù)的文章。

安裝

系統(tǒng)默認安裝,可以參考其他教程 。在命令行下執(zhí)行。

  1. sudo gem install cocoapods 

我的環(huán)境是 HomeBrew

  1. # 添加 taobao Mirror 不然被墻掉沒辦法下載 
  2. gem sources -a http://ruby.taobao.org/ 
  3. # 安裝 
  4. gem install cocoapods 
  5. # 更新命令 
  6. rbenv rehash 
  7. # 執(zhí)行 
  8. pod 
  9. # 此時一般會下載官方的所有 PodSpec 庫,也可以用 pod setup 初始化環(huán)境 

本文不打算在安裝部分耗費太多時間。希望看到這里保證你的命令行下有可用的 pod 命令。

使用

假設我們已經(jīng)有個項目,叫 ProjName ,需要使用一些注明的 CocoaPods 庫,比如 AFNetworking3.

首先,命令行 cd 到我們的項目目錄,一般 ls 命令會看到如下幾個文件夾

  1. ProjName 
  2. ProjName.xcodeproj 
  3. ProjNameTests 

贊,就是這里,創(chuàng)建一個 Podfile 文本文件,寫入如下內(nèi)容

  1. platform :ios, "8.0" 
  2. pod "AFNetworking""~> 2.0" 

一般這么簡單的文件都是直接 nano 寫。 :)

直接創(chuàng)建 Podfile , CocoaPods 會創(chuàng)建一個項目同名的 WorkSpace ,然后添加一個叫 Pods 的項目,這個項目編譯結(jié)果是一個叫 libPods.a的鏈接庫, 它會添加到我們之前的 ProjName 項目中作為編譯依賴。

當然,通過命令行執(zhí)行 pod init 也可以自動創(chuàng)建 Podfile,而且可以自動分析當前項目的 target ,相對來說更好,也更優(yōu)雅。具體請參考官方手冊。這樣的好處是更細致,還可以區(qū)分多個子項目子 target 。原理大同小異。

然后接下來,命令行執(zhí)行 open ProjName.xcworkspace,注意這個可不是 .xcodeproj,這個是 CocoaPods 為我們創(chuàng)建的一個 WorkSpace ,包含我們之前的項目,和 Pods 依賴。

開始編碼過程。直接在代碼里調(diào)用,比如寫在某個按鈕的 @IBAction 里:

  1. let manager = AFHTTPRequestOperationManager() 
  2.    let url = "http://api.openweathermap.org/data/2.5/weather" 
  3.    println(url) 
  4.   
  5.    let params = ["lat": 39.26, "lon": 41.03, "cnt":0] 
  6.    println(params) 
  7.   
  8.    manager.GET(url, 
  9.        parameters: params, 
  10.        success: { (operation: AFHTTPRequestOperation!, 
  11.                    responseObject: AnyObject!) in 
  12.            println("JSON: " + responseObject.description!) 
  13.        }, 
  14.        failure: { (operation: AFHTTPRequestOperation!, 
  15.                    error: NSError!) in 
  16.            println("Error: " + error.localizedDescription) 
  17.        }) 

這里直接抄了 JakeLin 的 SwiftWeather 代碼4,就一小段,希望他不會打我。

Swift 坑爹了

看起來貌似我們已經(jīng)可以在 Swift 中使用 AFNetworking 了。結(jié)果剛寫幾句代碼一堆類和變量找不到定義,而且坑爹的是很多時候我們只能靠猜測,判斷這些 Objective-C 的定義轉(zhuǎn)換成 Swift 定義是什么樣子,用起來就是完全靠蒙!

這不科學!

這都三禮拜了,所以大家都摸索出了調(diào)用的方法,那就是按照和 Objective-C 代碼混編的例子,添加 Bridging Header !

繼續(xù)

之前簡單介紹過和 Objective-C 交互的內(nèi)容5,大家可以去圍觀。

一般說來,你在 Swift 項目新建 Objective-C 類的時候,直接彈出是否創(chuàng)建 Bridge Header 的窗口,點 YES 就是了,這時候一般多出來個 ProjectName-Bridging-Header.h 。然后刪掉這個類, Bridging Header 頭文件還在。

在這個 Bridging Header 文件里寫入要導入的 CocoaPods 庫,就可以在 Swift 中使用了。

  1. #import <AFNetworking/AFNetworking.h> 

如果沒有自動創(chuàng)建頭文件的話,這個配置在項目的 Build Settings 中的 Swift Compiler – Code Generation 子項里。

創(chuàng)建一個頭文件,指定為 Bridging Header 也可以。

然后編譯,成功執(zhí)行!

這就完事了?

實際上,前兩天剛寫一篇 Swift 的模塊系統(tǒng) , 把任意 Objective-C 庫當做 Swift Module 是可行的。當時就覺得這個東西應該是可能完全進入 CocoaPods 的,但是在官方 repo 找了下發(fā)現(xiàn),以前有人提過增加 module.map 支持,結(jié)果 CocoaPods 的人認為這個是 llvm 內(nèi)部特性, issue 被關(guān)閉了。#2216 最近又被提起,我在后面提了下 Swift 支持,希望官方靠譜。

所以下面的內(nèi)容,就是,我們是否可以在 CocoaPods 上加入 module.map 支持,然后直接在 Swift 中 import ModuleName ?

擴展 CocoaPods

考慮了多種方式,***選擇了 Hook 的方式。如果 Ruby 技術(shù)足夠好,或許可以直接寫個插件?;蛘咧苯痈墓俜酱a給官方提交。但是實在能力有限。相關(guān)的 module.map 語法參考 llvm 官方手冊 Modules – Clang 3.5 documentation。用了最簡單的功能。也許遇到復雜的 PodSpec 就不起作用了,但是原理如此,相信小伙伴們已經(jīng)知道怎么做了。

目前我的 Podfile 大概是這個樣子:

  1. platform :ios, "8.0" 
  2. pod "AFNetworking""~> 2.0" 
  3. pod "Baidu-Maps-iOS-SDK""~> 2.0" 
  4.   
  5. post_install do |installer| 
  6.   File.open("#{installer.sandbox_root}/Headers/module.map"'w'do |fp| 
  7.     installer.pods.each do |pod| 
  8.       normalized_pod_name = pod.name.gsub('-'''
  9.       fp.write <<EOF 
  10. module #{normalized_pod_name} [system] { 
  11.   umbrella "#{pod.name}" 
  12.   export * 
  13. EOF 
  14.       puts "Generating Swift Module #{normalized_pod_name.green} for #{pod} OK!" 
  15.     end 
  16.   end 
  17. end 

post_install 是 Podfile 的一種 hook 機制,可以用來加入自定義操作。我在這里的寫的邏輯就是,針對所有的 Pod 生成一個 module.map 文件。 位于 Pods/Headers/,這個目錄被 CocoaPods 自動設置為項目的 Header Search Path 所以不需要額外處理。默認我們的 Swift 文件就找得到。

其中 normalized_pod_name 用于處理百度地圖 API SDK 這一類名字帶減號的庫,因為他們不能作為 Module Name ,實際上或許有更好的方法來處理。

實際效果

實測發(fā)現(xiàn)完全沒有問題,直接 import AFNetworking 或者 import BaiduMapsiOSSDK 都可以。

而且很不錯的一點是,按住 Command 鍵,然后鼠標點擊模塊名、類名等,會跳轉(zhuǎn)到 Swift 定義。

遇到提示 .pcm 文件 outdate 的情況下需要你刪除 $HOME/Library/Developer/Xcode/DerivedData/ModuleCache 目錄,這個目錄保存的是預編譯模塊,類似于預編譯頭文件。

目前 Swift 還是有很多 BUG 的,調(diào)用 NSObject 也許會讓編譯器直接 segment fault ,不帶任何出錯信息。很傷情。此時請***時間檢查語法是否有詭異,其次將所有用到字符串或者 Optional 的地方都額外用變量處理,避免用字面常量。(個人經(jīng)驗)

如果多次調(diào)用 pod install 并在其中修改過 Podfile,那么有可能你的項目依賴會亂掉,多了不存在的 .a 文件到依賴或者多次包含。手工在項目樹和項目選項里刪除就可以了。此類編譯錯誤都是鏈接錯誤。

總結(jié)

本文提出了一種 Bridging Header 之外的使用 CocoaPods 庫的方法。利用有限的 Ruby 知識寫了個 Hook 。目前測試 OK 。

參考

  1. CocoaPods Offical Site CocoaPods 官網(wǎng)
  2. CocoaPods – CocoaChina CocoaChina 對 CocoaPods 的介紹
  3. AFNetworking – Github
  4. SwiftWeather
  5. Swift and ObjectiveC Interop (Swift 與 Objective-C 之間的交互)
責任編輯:閆佳明 來源: blog.jobbole
相關(guān)推薦

2015-08-27 09:46:09

swiftAFNetworkin

2011-08-10 09:31:41

Hibernateunion

2021-03-09 07:27:40

Kafka開源分布式

2021-06-09 09:36:18

DjangoElasticSearLinux

2022-05-17 08:25:10

TypeScript接口前端

2024-01-18 08:37:33

socketasyncio線程

2022-06-23 08:00:53

PythonDateTime模塊

2025-03-21 09:58:59

Python數(shù)據(jù)類型安全

2021-09-10 10:30:22

Java代碼

2022-10-25 09:07:28

Linuxxargs命令

2023-12-01 09:18:27

AxiosAxios 庫

2015-11-26 10:57:56

DockerOpen vSwitc

2019-09-16 19:00:48

Linux變量

2020-04-09 10:18:51

Bash循環(huán)Linux

2024-09-06 11:34:15

RustAI語言

2020-11-30 11:55:07

Docker命令Linux

2020-06-30 12:00:12

AIOps人工智能IT運營

2023-03-05 19:28:11

JavaScripCSS

2010-08-05 13:07:11

FlexJson

2012-05-01 20:57:26

Sencha Touc
點贊
收藏

51CTO技術(shù)棧公眾號