Edited at
SwiftDay 24

Swift時代のおすすめXcodeワークスペース設定

More than 3 years have passed since last update.

先日書いたSwift紹介記事の中でSwiftベースのライブラリSwiftyJSONAlamofire、その2つをラクに扱うAlamofire-SwiftyJSONのご紹介をしました。

これらのライブラリは十分成熟しており現状でとても便利に使えるのですが、現状、CocoaPodsがSwiftベースのライブラリに正式対応していないこともあり、導入時は手でワークスペースに追加する必要があります。(CocoaPodsもSwift対応が進められている様で、あと数ヶ月すれば状況は変わるかもしれませんね。)

本来iOSアプリのビルドプロセスは非常に複雑です。そして外部のプロジェクトをライブラリとして追加するにはiOSアプリのビルドプロセスに手を突っ込む必要があります。Objective-CベースのライブラリではCocoaPodsに頼り切っていたゆるふわプログラマの自分にはとても大変でした。

という訳で、Swiftベースのワークスペースを作る時にSwiftベースのライブラリとCocoaPodsベースのライブラリを組み込んで使える様にするまでの手順のまとめです。

なお、Swiftベースのライブラリについて、各プロジェクトページに導入法が書いてあるのですが自分の環境では安定せず、試行錯誤の結果作成した手順であり、すなわち公式手順ではないのでご了承ください。


プロジェクトの作成

プロジェクトの作成については特に注意すべき点はありません。

ふつうにプロジェクトを作成します。LanguageにはSwiftを選択します。

01-make-project.png


CocoaPodsの組込


インストール

プロジェクトを作成したらいったんXcodeを閉じてCocoaPodsを組み込みましょう。

プロジェクトフォルダに以下のPodfileを作成します。

platform :ios, '7.0'

pod 'SDWebImage'

作成したらコンソールでpod installします。

$ pod install

Analyzing dependencies
Downloading dependencies
Installing SDWebImage (3.7.1)
Generating Pods project
Integrating client project

[!] From now on use `SwiftProject.xcworkspace`.

ここまではObjective-Cベースのプロジェクトと同じですね。

CocoaPodsが組み込めたらワークスペースを開きます。(上記の例の場合SwiftProject.xcworkspace。


Swiftからの参照設定

CocoaPodsで入れたライブラリをSwiftから使うための設定をします。

このためにはBridging Headerファイルを作って、その中に#importを書きます。このファイルはXcodeでObjective-Cのファイルを作成するとXcodeが作ってくれますので、ここはその方法でラクをしましょう。

プロジェクトにdummy.mという名前のObjective-Cファイルを追加します。

02-add-objective-c-file.png

保存場所を決める時にTargetsにテスト用のターゲットも設定しておくと、テスト用のBridging Headerファイルも作ってくれます。

03-test-target.png

ファイルを作成すると「bridging headerファイルを作る?」と聞かれますので「Yes」と答えましょう。

04-bridging-header-dialog.png

これでBridging Headerファイルがプロジェクトに追加されます。

05-bridging-header.png

ファイルを開いて以下の様に書けばSwiftからSDWebImage/UIImage+WebCacheが使えます。


SwiftProject-Bridging-Header.h

//

// Use this file to import your target's public headers that you would like to expose to Swift.
//

#import <SDWebImage/UIImageView+WebCache.h>


Swift側では特にImportなどを書く必要はありません。UIImageViewのインスタンスの後に.sdぐらいまで入力して待っていれば適切に候補が表示されます。

なお、dummy.mはこれ以降不要なので削除してもOKです。


Swiftベースライブラリの組込

次はSwiftベースのライブラリです。


ライブラリのClone

Xcodeをいったん閉じてコンソールから以下の様に作業します。これはAlamofire-SwiftyJSONをGitHubからCloneし、そのサブモジュールのAlamofireSwiftyJSONもCloneする手順です。

現在のプロジェクトディレクトリは以下の様になっています。

$ ls -alF

total 40
drwxr-xr-x 12 Tom staff 408 12 24 15:44 ./
drwx------+ 7 Tom staff 238 12 24 15:45 ../
-rw-r--r--@ 1 Tom staff 6148 12 24 15:55 .DS_Store
drwxr-xr-x 13 Tom staff 442 12 24 15:56 .git/
-rw-r--r-- 1 Tom staff 38 12 6 18:43 Podfile
-rw-r--r-- 1 Tom staff 211 12 24 15:41 Podfile.lock
drwxr-xr-x 8 Tom staff 272 12 24 15:41 Pods/
drwxr-xr-x 9 Tom staff 306 12 24 15:55 SwiftProject/
drwxr-xr-x 5 Tom staff 170 12 24 15:44 SwiftProject.xcodeproj/
drwxr-xr-x 4 Tom staff 136 12 24 15:42 SwiftProject.xcworkspace/
drwxr-xr-x 4 Tom staff 136 12 24 15:40 SwiftProjectTests/
-rw-r--r--@ 1 Tom staff 187 12 24 15:44 dummy.m

これにAlamofire-SwiftyJSONをCloneします。

$ git submodule add https://github.com/SwiftyJSON/Alamofire-SwiftyJSON.git

Cloning into 'Alamofire-SwiftyJSON'...
remote: Counting objects: 64, done.
remote: Total 64 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (64/64), done.
Checking connectivity... done.

続いてサブモジュールをClone。

$ cd Alamofire-SwiftyJSON

$ git submodule init
Submodule 'Alamofire' (https://github.com/Alamofire/Alamofire.git) registered for path 'Alamofire'
Submodule 'SwiftyJSON' (https://github.com/SwiftyJSON/SwiftyJSON.git) registered for path 'SwiftyJSON'
$ git submodule update
Cloning into 'Alamofire'...
remote: Counting objects: 787, done.
remote: Compressing objects: 100% (29/29), done.
remote: Total 787 (delta 10), reused 5 (delta 0)
Receiving objects: 100% (787/787), 375.19 KiB | 191.00 KiB/s, done.
Resolving deltas: 100% (417/417), done.
Checking connectivity... done.
Submodule path 'Alamofire': checked out 'b5d6f581a8a01cb0e985f580dc36d87581f40d9b'
Cloning into 'SwiftyJSON'...
remote: Counting objects: 853, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 853 (delta 4), reused 0 (delta 0)
Receiving objects: 100% (853/853), 265.32 KiB | 184.00 KiB/s, done.
Resolving deltas: 100% (486/486), done.
Checking connectivity... done.
Submodule path 'SwiftyJSON': checked out '25ceb607a457aad56e679e687d271c837a7c9e8b'

これでCloneはおしまい。プロジェクトディレクトリは以下の様になりました。

$ ls -alF

total 48
drwxr-xr-x 14 Tom staff 476 12 24 16:01 ./
drwx------+ 7 Tom staff 238 12 24 15:45 ../
-rw-r--r--@ 1 Tom staff 6148 12 24 15:55 .DS_Store
drwxr-xr-x 14 Tom staff 476 12 24 16:01 .git/
-rw-r--r-- 1 Tom staff 126 12 24 16:01 .gitmodules
drwxr-xr-x 12 Tom staff 408 12 24 16:01 Alamofire-SwiftyJSON/
-rw-r--r-- 1 Tom staff 38 12 6 18:43 Podfile
-rw-r--r-- 1 Tom staff 211 12 24 15:41 Podfile.lock
drwxr-xr-x 8 Tom staff 272 12 24 15:41 Pods/
drwxr-xr-x 9 Tom staff 306 12 24 15:55 SwiftProject/
drwxr-xr-x 5 Tom staff 170 12 24 15:44 SwiftProject.xcodeproj/
drwxr-xr-x 4 Tom staff 136 12 24 15:42 SwiftProject.xcworkspace/
drwxr-xr-x 4 Tom staff 136 12 24 15:40 SwiftProjectTests/
-rw-r--r--@ 1 Tom staff 187 12 24 15:44 dummy.m


ワークスペースへの組込

Cloneが出来たら再度ワークスペースを開きます。コンソールにいる場合、そのまま

$ open SwiftProject.xcworkspace

とかするとXcodeが開いて便利です。

ワークスペースが開いたら先ほどプロジェクトディレクトリ配下にCloneしたAlamofire-SwiftyJSONディレクトリの下のAlamofire-SwiftyJSON.xcodeprojをプロジェクトナビゲータ(Xcode左のファイルが表示されるところ)のPodsの下あたりにドラッグ & ドロップします。

Alamofire-SwiftyJSONの下にAlamofireSwiftyJSONが入ってればOK。

06-add-swift-base-library.png

最後にSwiftProjectを選択してターゲットSwiftProjectのLinked Frameworks and LibrariesのところにAlamofire.framework, SwiftyJSON.framework, AlamofireSwiftyJSON.frameworkを追加すればOK。

07-link-frameworks.png

これでSwiftからSwiftベースのライブラリが使える様になりました。


実機で動かすための設定

(2014/12/31追記)

実機で動かす場合には以下の2つの設定が追加で必要です。


Code Sign

SwiftyJSONは現状、Code SigningがDon't Code Sign設定になっているので実機で動かす時は適宜正しく設定してあげてください。

(SwiftyJSON.xcodeproj → PROJECT → SwiftyJSON → Build Settings → Code SigningのCode Signing Identityを設定してあげる)


Copy Files

以下の様にCopy Files欄に3つのFrameworkを追加します。

add-copy-files.png

[+]ボタンでFrameworkの選択肢が現れない場合は、前述のLink Binary With Librariesから追加したFrameworkを削除してから追加しなおしてみてください。

Copy Files欄が無い場合はEditorメニュー → Add Build Phase → Add Copy Files Build Phaseとすると追加できます。このメニューがグレー表示されていて選択できないことがありますがどうもこれはXcodeのバグの様で、Build Phasesタブを選択し、右上のSearch欄にフォーカスを当てて改めてEditorメニューから辿ると選択できる様になります。


使ってみる

importで各ライブラリをインポートして使います。


ViewController.swift

import UIKit

import Alamofire
import SwiftyJSON
import AlamofireSwiftyJSON

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
var apiBaseUrl = "http://www.example.com"
var params = [String: String]()
Alamofire.request(.GET, apiBaseUrl, parameters: params).responseSwiftyJSON {
(request, response, json, error) -> Void in
println(json)
}
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}


Happy Swift!