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}"

  2. 验证是否安装成功

1
2
$ swift build --version
Swift Package Manager - Swift 3.0.2
  1. 怎么使用 首先,使用 mkdir 创建一个新的目录,用来放置你的包或者应用。 这里我们使用 helloworld 作为例子:mkdir helloworld。 然后,使用 cd 命令进入 helloworld 目录,运行命令:swift build --init
1
2
3
4
5
6
7
# 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 文件内容如下:

1
2
3
4
5
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)

文件内容如下

1
2
3
4
5
6
7
8
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类库在GitHub地址是:https://github.com/Alamofire/Alamofire.git

为了确定Alamofire是否支持CocoaPods,可以用CocoaPods的搜索功能验证一下。在终端中输入: pod search Alamofire

如果能正确返回Alamofire 相关信息。这说明,Alamofire是支持CocoaPods,所以我们可以利用CocoaPods将Alamofire导入你的项目中。

我们创建一个swift的ios项目,然后在终端中切换到该项目的根目录,运行以下命令: pod init

这个命令会在根目录下生成一个Podfile,我们在这个文件中添加相应的依赖就可以了.

修改Podfile文件,添加依赖

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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

1
2
3
4
5
6
7
8
9
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

1
2
$ brew update
$ brew install carthage

如果你不喜欢使用终端,也可以从网站https://github.com/Carthage/Carthage/releases 下载最新版的Carthage.pkg来更新。

当你安装好Carthage后,在终端执行$ carthage version

即可看到当前的carthage版本, 当我写这篇文章的时候,Carthage的版本为0.20.1 。现在,你已经安装好了Carthage,接下来就是在你的项目中使用carthage了:

  • 通过终端进入到项目所在的文件夹
  • 创建一个空的carthage文件
  • 使用xcode打开cartfile文件 open -a Xcode Cartfile
  • 添加内容
1
2
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,让我们拭目以待吧。

七. 使用Alamofire来玩点有趣的吧

未完待续

署名 - 非商业性使用 - 禁止演绎 4.0