1. 程式人生 > >swift專案初探

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能做些什麼

  1. IOS手機APP開發(據說也能開發android應用,期待大一統)
  2. Mac電腦應用,同樣的軟體,在mac上看著就是高雅,這不得不說是apple的功勞
  3. watchOS和TvOS,暫時沒接觸到
  4. 服務端開發,也就是說可以開發網站或者其他各種東西,對應框架有Perfect,Vapor,Kitura 和 Zewo. 附一篇文章介紹
  5. 其他待挖掘,世界各國的電腦科學家們可不是打醬油的.

三. SPM是什麼鬼

Swift Package Manager(SPM)是蘋果最新的官方工具,可以用來管理 Swift 程式碼的分配,它為 Swift 編譯系統集成了自動進行下載、編譯和連線依賴的過程,不過目前還處於早期開發階段。

支援的平臺

✔ macOS
✔ Linux
✘ iOS
✘ watchOS
✘ tvOS

在此之前我們常用的工具是CocoapodsCarthage


1. 如何下載
下載對應版本,然後安裝
在終端中執行 export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"

  1. 驗證是否安裝成功
$ swift build --version
Swift Package Manager - Swift 3.0.2
  1. 怎麼使用
    首先,使用 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 生成的內容:

  1. Package.swift:包的”配置資訊”(manifest)。swift build --init使用你建立的目錄名作為包名。
  2. Sources目錄:按照 SwiftPM 的要求,所有的原始碼檔案都放到 Sources 目錄下。
  3. main.swift:Swift 應用使用 main.swift(有且只有一個)作為程式執行的入口。
  4. Tests 目錄:存放應用的測試用例。
  5. .gitignore:一個便捷的 git gitignore 檔案,忽略一些本地編譯時用到的配置目錄和檔案,比如: .buildPackages 目錄(一些你不想加入到 git 庫的東西)。

在這個 helloword 例子中,Package.swift 檔案內容如下:

import PackageDescription

let package = Package(
    name: "helloworld"
)

執行 swift build 會建立可執行檔案 .build/debug/helloworld,執行這個檔案就會在終端輸出 Hello, world!.
如果你想編譯一個 Swift 庫,只需要刪除 main.swift 檔案,然後替換成你的庫程式碼。在沒有 main.swift 的情況下,SwiftPM 會建立一個靜態的庫。

  1. 怎麼在xcode中開啟
    在專案根目錄執行 swift package generate-xcodeproj,會生成xcodeproj,此時可以用xcode開啟這個專案
    我們來看看生成的程式碼是什麼樣子的

  2. 怎麼新增其他依賴
    我們以引入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又是幹咩的

  1. CocoaPods是什麼?
    當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他類庫,“子子孫孫無窮盡也”,這也許是比較特殊的情況。總之我的意思就是,手動一個個去下載所需類庫十分麻煩。另外一種常見情況是,你專案中用到的類庫有更新,你必須得重新下載新版本,重新加入到專案中,十分麻煩。如果能有什麼工具能解決這些惱人的問題,那將“善莫大焉”。所以,你需要 CocoaPods。
    CocoaPods應該是iOS最常用最有名的類庫管理工具了,上述兩個煩人的問題,通過cocoaPods,只需要一行命令就可以完全解決,當然前提是你必須正確設定它。重要的是,絕大部分有名的開源類庫,都支援CocoaPods。所以,作為iOS程式設計師的我們,掌握CocoaPods的使用是必不可少的基本技能了。
  2. 如何下載和安裝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出來多半都是使用SPMcocoapods,所以我們暫時也從這裡面二選一吧。前面提到目前 swift 3.0.1只支援mac oslinux系統,所以開發ios應用的話選用cocoapods會好一些,我會花了更多的時間在cocoapods上面。但是,我更期待SPM能夠支援IOS,讓我們拭目以待吧。

1