swift專案初探
截至到上一篇部落格到現在為止差不多有一個月了,時光飛逝,從來沒有覺得時間過的如此之快。在這一個月中其實發生了很多事:學完了日語中級上冊,記了整整一本筆記;裝上了黑蘋果,因此也有機會接觸到IOS相關的內容,所以大致過了一遍swift3的語法;養了一隻小倉鼠,生活變的有趣許多;整理了一下github,切換了主郵箱。其他來說,生活依舊在繼續,折騰一直未停止,為了生活,為了程式設計.我一直在努力,也從未放棄。記一篇swift入門的部落格以作慰藉。
前言
因為本人是在學習swift中,所以這篇文章更多的成份算是自己的筆記,只是將自己的經歷分享出來。請大牛們勿噴,小白們別當權威。如果有錯誤請指出,我一定會虛心改正。最後,與君共勉,早日成為獨當一面的人物。
一.基本環境
OS x 10.11.6
Xcode 8.2.1
swift 3.0.2
swift package manager 3.0.2
pod 1.2.1
carthage 0.20.1
因為xcode是嚴格和os x版本對照的,所以我的10.11.6黑蘋果就止步於8.2.1版本的xcode,因此swift3.1也玩不了,表示很心痛.
二 swift能做些什麼
- IOS手機APP開發(據說也能開發android應用,期待大一統)
- Mac電腦應用,同樣的軟體,在mac上看著就是高雅,這不得不說是apple的功勞
- watchOS和TvOS,暫時沒接觸到
- 服務端開發,也就是說可以開發網站或者其他各種東西,對應框架有Perfect,Vapor,Kitura 和 Zewo. 附一篇文章介紹
- 其他待挖掘,世界各國的電腦科學家們可不是打醬油的.
三. SPM是什麼鬼
Swift Package Manager(SPM)是蘋果最新的官方工具,可以用來管理 Swift 程式碼的分配,它為 Swift 編譯系統集成了自動進行下載、編譯和連線依賴的過程,不過目前還處於早期開發階段。
支援的平臺
✔ macOS
✔ Linux
✘ iOS
✘ watchOS
✘ tvOS
在此之前我們常用的工具是Cocoapods
和Carthage
1. 如何下載
下載對應版本,然後安裝
在終端中執行
export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"
- 驗證是否安裝成功
$ swift build --version
Swift Package Manager - Swift 3.0.2
- 怎麼使用
首先,使用mkdir
建立一個新的目錄,用來放置你的包或者應用。
這裡我們使用helloworld
作為例子:mkdir helloworld
。
然後,使用cd
命令進入helloworld
目錄,執行命令:swift build --init
。
# cd helloworld
# swift build --init
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/
我們看看 swift build --init
生成的內容:
Package.swift
:包的”配置資訊”(manifest)。swift build --init
使用你建立的目錄名作為包名。Sources
目錄:按照 SwiftPM 的要求,所有的原始碼檔案都放到 Sources 目錄下。main.swift
:Swift 應用使用main.swift
(有且只有一個)作為程式執行的入口。Tests
目錄:存放應用的測試用例。.gitignore
:一個便捷的git gitignore
檔案,忽略一些本地編譯時用到的配置目錄和檔案,比如:.build
和Packages
目錄(一些你不想加入到 git 庫的東西)。
在這個 helloword
例子中,Package.swift
檔案內容如下:
import PackageDescription
let package = Package(
name: "helloworld"
)
執行 swift build
會建立可執行檔案 .build/debug/helloworld
,執行這個檔案就會在終端輸出 Hello, world!
.
如果你想編譯一個 Swift 庫,只需要刪除 main.swift
檔案,然後替換成你的庫程式碼。在沒有 main.swift
的情況下,SwiftPM
會建立一個靜態的庫。
怎麼在xcode中開啟
在專案根目錄執行swift package generate-xcodeproj
,會生成xcodeproj
,此時可以用xcode開啟這個專案
我們來看看生成的程式碼是什麼樣子的
怎麼新增其他依賴
我們以引入Alamofire為例
專案根目錄有一個Package.swift
的檔案,開啟這個檔案,加入Alamofire的地址.Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4)
檔案內容如下
import PackageDescription
let package = Package(
name: "spg",
dependencies: [
.Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4)
]
)
然後執行再次在專案根目錄執行 swift build
就會下載Alamofire的依賴
四. pod又是幹咩的
- CocoaPods是什麼?
當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,“子子孫孫無窮盡也”,這也許是比較特殊的情況。總之我的意思就是,手動一個個去下載所需類庫十分麻煩。另外一種常見情況是,你專案中用到的類庫有更新,你必須得重新下載新版本,重新加入到專案中,十分麻煩。如果能有什麼工具能解決這些惱人的問題,那將“善莫大焉”。所以,你需要 CocoaPods。
CocoaPods應該是iOS最常用最有名的類庫管理工具了,上述兩個煩人的問題,通過cocoaPods,只需要一行命令就可以完全解決,當然前提是你必須正確設定它。重要的是,絕大部分有名的開源類庫,都支援CocoaPods。所以,作為iOS程式設計師的我們,掌握CocoaPods的使用是必不可少的基本技能了。 - 如何下載和安裝CocoaPods?
在安裝CocoaPods之前,首先要在本地安裝好Ruby環境。至於如何在Mac中安裝好Ruby環境,請google一下,本文不再涉及。
假如你在本地已經安裝好Ruby環境,那麼下載和安裝CocoaPods將十分簡單,只需要一行命令。在Terminator(也就是終端)中輸入以下命令(注意,本文所有命令都是在終端中輸入並執行的。什麼,你不知道什麼是終端?那請我吃飯,我告訴你):
sudo gem install cocoapods
如果下載不了可能又是偉大的牆在發揮作用,請自行翻牆或修改國內映象源.
正常來說,等上十幾秒鐘,CocoaPods就可以在你本地下載並且安裝好了,不再需要其他設定。
好了,安裝好CocoPods之後,接下來就是使用它。所幸,使用CocoPods和安裝它一樣簡單,也是通過一兩行命令就可以搞定。
我在這裡用兩種使用場景來具體說明如何使用CocoaPods。
場景1:利用CocoaPods,在專案中匯入Alamofire類庫
為了確定Alamofire是否支援CocoaPods,可以用CocoaPods的搜尋功能驗證一下。在終端中輸入:
pod search Alamofire
如果能正確返回Alamofire
相關資訊。這說明,Alamofire是支援CocoaPods,所以我們可以利用CocoaPods將Alamofire匯入你的專案中。
我們建立一個swift的ios專案,然後在終端中切換到該專案的根目錄,執行以下命令:
pod init
這個命令會在根目錄下生成一個Podfile
,我們在這個檔案中新增相應的依賴就可以了.
修改Podfile檔案,新增依賴
# Uncomment the next line to define a global platform for your project
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ’10.2’
target 'cocopodsDemo' do
pod 'Alamofire', '~> 4.4'
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!
# Pods for cocopodsDemo
target 'cocopodsDemoTests' do
inherit! :search_paths
# Pods for testing
end
target 'cocopodsDemoUITests' do
inherit! :search_paths
# Pods for testing
end
end
然後執行 pod install
Analyzing dependencies
Downloading dependencies
Installing Alamofire (4.4.0)
Generating Pods project
Integrating client project
[!] Please close any current Xcode sessions and use `cocopodsDemo.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
注意提示: 告訴我們要關掉xocode,選擇
cocopodsDemo.xcworkspace
開啟專案,目錄結構現在應該是這個樣子的.
新增Alamofile
依賴
Product
=>Schemes
=>Manage Schemes
,將Alamofile
勾上,
此時,我們就可以使用Alamofile
來做些有趣的事情了。
關於 Podfile.lock
當你執行pod install之後,除了 Podfile 外,CocoaPods 還會生成一個名為Podfile.lock的檔案,Podfile.lock 應該加入到版本控制裡面,不應該把這個檔案加入到.gitignore中。因為Podfile.lock會鎖定當前各依賴庫的版本,之後如果多次執行pod install 不會更改版本,要pod update才會改Podfile.lock了。這樣多人協作的時候,可以防止第三方庫升級時造成大家各自的第三方庫版本不一致
場景2:如何正確編譯執行一個包含CocoPods類庫的專案
你也許曾經遇到過(特別是新手iOS開發者)這種情況,好不容易在GitHub上找到一份程式碼符合自己想需求,興沖沖下載下來,一編譯,傻眼了,發現有各種各樣錯誤。一看,原來是缺失了各種其他第三方類庫。這時候莫慌,你再仔細一看,會發現你下載的程式碼包含了Podfile。沒錯,這意味著你可以用CocoaPods很方便下載所需要的類庫。
下面,我以程式碼 UAAppReviewManager 為例來說明如何正確編譯執行一個包含CocoPods類庫的專案。
UAAppReviewManager是一個能夠讓你方便地將提醒使用者評分的功能加入你的應用中。當你去UAAppReviewManager的GitHub地址下載這份程式碼之後,開啟Example工程(UAAppReviewManagerExample),編譯,你會發現Xcode報告一大堆錯誤,基本都是說你編譯的這份程式碼找不到某某標頭檔案,這就意味著你要成功編譯UAAppReviewManager的Example程式碼,必須先匯入一些第三方類庫。同時你會發現在UAAppReviewManagerExample資料夾下面有三個跟CocosPods相關的檔案(資料夾):Podfile,Podfile.lock和Pods
這時候,開啟終端,進入UAAppReviewManagerExample所在的目錄,也就是和Podfile在同一目錄下,和場景1一樣,輸入以下命令(由於已經有Podfile,所以不需要再建立Podfile):
$ pod update
這時候,再回到UAAppReviewManagerExample
資料夾看一看,會看到多了一個檔案UAAppReviewManagerExample.xcworkspace
根據終端的資訊提示,你以後就需用新產生的UAAppReviewManagerExample.xcworkspace
來執行這個Example
程式碼了。
開啟UAAppReviewManagerExample.xcworkspace
,編譯執行,成功
注意,這裡有個小問題,如果剛剛你不是輸入$ pod update
,而是輸入$ pod install
,會發現類庫匯入不成功
這裡的意思大概是Podfile
檔案過期,類庫有升級,但是Podfile
沒有更改。$ pod install
只會按照Podfile
的要求來請求類庫,如果類庫版本號有變化,那麼將獲取失敗。但是 $ pod update
會更新所有的類庫,獲取最新版本的類庫。而且你會發現,如果用了 $ pod update
,再用 $ pod install
就成功了。
那你也許會問,什麼時候用 $ pod install
,什麼時候用 $ pod update
呢,我又不知道類庫有沒有新版本。好吧,那你每次直接用 $ pod update
算了。或者先用 $ pod install
,如果不行,再用 $ pod update
。
五. Carthage
說到Carthage,就要先說swift,2014年蘋果釋出swift初期,用swift編寫的第三方庫就只能通過拖動原始碼到自己的專案中才能被呼叫, 由於當時只有寥寥無幾的開源庫,且不能打包,加上swift1.0並不是那麼好用,許多人對swift持著觀望的態度。隨著swift逐步趨於穩定,並且從ios8.0開始支援將自己寫的swift打包成framework,越來越多的純swift編寫框架開始出現,就在這時候carthage突然出現在人們的視野中,而且陸陸續續幾乎所有的開源框架都開始支援carthage。
安裝使用Carthage
$ brew update
$ brew install carthage
當你安裝好Carthage後,在終端執行$ carthage version
即可看到當前的carthage版本, 當我寫這篇文章的時候,Carthage的版本為0.20.1 。現在,你已經安裝好了Carthage,接下來就是在你的專案中使用carthage了:
- 通過終端進入到專案所在的資料夾
- 建立一個空的carthage檔案
- 使用xcode開啟cartfile檔案
open -a Xcode Cartfile
- 新增內容
github "Alamofire/Alamofire" ~> 4.4
github "SwiftyJSON/SwiftyJSON"
- 儲存並關閉cart file檔案,在終端執行命令
carthage update --platform iOS
,carthage會為你下載和編譯所需要的第三方庫,當命令執行完畢,在你的專案資料夾中會建立一個名為Carthage的資料夾 - 新增依賴
六. 如何選擇
google出來多半都是使用SPM
和cocoapods
,所以我們暫時也從這裡面二選一吧。前面提到目前 swift 3.0.1
只支援mac os
和 linux
系統,所以開發ios應用的話選用cocoapods
會好一些,我會花了更多的時間在cocoapods
上面。但是,我更期待SPM
能夠支援IOS
,讓我們拭目以待吧。
1