Swift で Framework を自作する

#前言
開発が進むと、一人で複数の案件を担当したりすることも増え、できれば共通の部分を一つにまとめたい、と言った欲求も出てくるのではないかと思います。その時に便利なのが、Framework というやつです。今回は Framework の作り方をとてもやさし〜くお伝えできればと思います。

#準備
Xcode でまず Workspace を作ります（1 プロジェクト 1 フレームワークでしたら普通に Project も問題ないのですが、複数のプロジェクトをまとめることを想定しているので敢えて Workspace で作ります）。まあ適当に File > New > Workpsace で作っちゃいましょう
![スクリーンショット 2015-07-27 18.13.32.png](https://qiita-image-store.s3.amazonaws.com/0/63998/fa910856-a5f6-8f79-f9fc-45c61a74968d.png)

作ったらこの時点では Workpsace は空ですので、左の Project Navigator（まあ左側のサイドバーの事）に右クリックして New Project を作りましょう
![スクリーンショット 2015-07-27 18.29.39.png](https://qiita-image-store.s3.amazonaws.com/0/63998/9294c970-a7e8-e5dc-22f2-62216ee0b826.png)

今回は iOS 用なので、Cocoa Touch Framework を選びます
![スクリーンショット 2015-07-27 18.29.43.png](https://qiita-image-store.s3.amazonaws.com/0/63998/8bdd877b-e7c0-0ad5-623a-e63a71732d70.png)

適当にフレームワーク名入れます
![スクリーンショット 2015-07-27 18.29.50.png](https://qiita-image-store.s3.amazonaws.com/0/63998/4f5bca9e-eccd-6327-9c4b-1a479d5fa515.png)

場所選びます。Add to はちゃんと今の Workspace にあることを確認してね♪
![スクリーンショット 2015-07-27 18.29.54.png](https://qiita-image-store.s3.amazonaws.com/0/63998/3db252e3-4d1d-e245-f1a1-73cb1e29d4c6.png)

できたらまた適当に通常のプロジェクトと同じようにいつもソースファイル入れてるところに新しいファイルを追加します、ちなみに今回はとりあえずサンプルとして UIView のサブクラスを自作します
![スクリーンショット 2015-07-27 18.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/63998/112f0e04-d9f9-73cd-b4c0-68db880cb4a9.png)

通常のプロジェクトと同じように適当に名前入れます
![スクリーンショット 2015-07-27 18.30.47.png](https://qiita-image-store.s3.amazonaws.com/0/63998/7c0bbfec-82d1-1953-34a2-b05559d29a82.png)

ここもちゃんと場所や Group と Targets があってるかどうか確認してね♪
![スクリーンショット 2015-07-27 18.40.24.png](https://qiita-image-store.s3.amazonaws.com/0/63998/ace81a90-997e-bee8-b381-3e1275e69915.png)

できたらとりあえず通常のプロジェクトと同じようにこんな感じなファイルが出来上がりますので♪
![スクリーンショット 2015-07-27 18.31.00.png](https://qiita-image-store.s3.amazonaws.com/0/63998/22222317-4ffe-bae3-c7dd-de1d81353893.png)

#内容を作成
ここまででとりあえず Framework を作る準備が出来たので、後は中身を作ります。今回はとりあえず自動で茶色の背景に「Hello, world!」の文字を表示する SampleView クラスを作りたいと思いますので、下記の内容を入れます

```swift
import UIKit

public class SampleView: UIView { // public、大事。とても大事

	public override init(frame: CGRect) {
		super.init(frame: frame)
		
		let titleLabel: UILabel = {
			let label = UILabel(frame: frame)
			label.text = "Hello, world!"
			label.textAlignment = .Center
			label.backgroundColor = UIColor.brownColor()
			self.addSubview(label)
			return label
		}()
	}

	required public init(coder aDecoder: NSCoder) {
	    fatalError("init(coder:) has not been implemented")
	}

}
```

ソースコードの中身自体は非常にシンプルなので特に説明するほどのものもそんなにないのですが、一つだけ、Framework を作る際は、Framework をインポートするプロジェクトからすると、その中身が基本参照出来ないようになっているので、プロジェクトからでもアクセスできるようにしたいものは `public` は絶対忘れないようにしてください。あと、`titleLabel` のこの書き方は最近勉強した Swift でのローカルスコープの書き方だけですので特に意味はありません。

ソースコードが書き終わったらこんな風になります：
![スクリーンショット 2015-07-27 18.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/63998/41d88848-9ad2-0504-9d52-3d370e334991.png)

#プロジェクトを作る
さてとりあえず簡単な Framework が出来上がりましたので、Project の作成に入ります。さっきと同じ要領で Workspace に Project を作ります
![スクリーンショット 2015-07-27 18.39.57.png](https://qiita-image-store.s3.amazonaws.com/0/63998/6ff4ebef-7b5d-7c1f-8414-654424ece50e.png)

名前を入れます
![スクリーンショット 2015-07-27 18.40.04.png](https://qiita-image-store.s3.amazonaws.com/0/63998/5dce2c90-830a-dfd8-e184-1a083d425ad8.png)

もちろん、Add to や Group などが正しいかどうかちゃんと確認します
![スクリーンショット 2015-07-27 18.40.24.png](https://qiita-image-store.s3.amazonaws.com/0/63998/00ca4d9c-9075-b92e-3c28-a666398c4914.png)

プロジェクト設定の General から Linked Frameworks and Libraries に Workspace から先ほど作った Framework を追加します
![スクリーンショット 2015-07-27 18.44.38.png](https://qiita-image-store.s3.amazonaws.com/0/63998/18c0e015-01a3-43b9-8c24-83610bfeaffd.png)

これで自分のプロジェクトから自作の Framework を参照する準備が整いました！

#Framework の内容を利用する
さて、先ほどの Framework で定義した SampleView を表示するプログラムを作りましょう。iPhone のプロジェクト制作でお馴染みの ViewController に行って、`import UIKit`の行の下に新しく 1 行を追加しましょう：

```swift
import SampleFramework
```

そして、`viewDidLoad()` メソッドに、こんないつもと同じような感じでこんな文を追加しましょう

```swift
		let myView = SampleView(frame: self.view.frame)
		self.view.addSubview(myView)
```

出来上がると、ViewController はこんなふうになると思います：
![スクリーンショット 2015-07-27 18.45.34.png](https://qiita-image-store.s3.amazonaws.com/0/63998/ce07e0f9-97c9-2ea3-4bce-f132693a2516.png)

これでプロジェクトをビルドしてラン！
![スクリーンショット 2015-07-27 18.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/63998/8b6cc49c-7410-f20c-86c1-b00e9a965b91.png)

いかがでしょうか？これで自分のプロジェクトに自分の作ったフレームワークがいつでも使えるようになりました！

#疑問点
ただし、上記の方法では全てのこの Framework を利用する Project を同じ Workpsace にまとめないといけないという欠点が発生します。第三者に自分の作った Framework を利用してもらいたいがソースコードまでは渡したくない場合とかは Framework を書き出したりしなければならないのですが、[ここ](https://www.youtube.com/watch?v=86cPaa3FrRg)を参照して書きだしたものをプロジェクトに入れてみたけど結局 `import SampleFramework` のところ `No such module 'SampleFramework'` のエラーが発生するんですよね…誰かわかる方いらっしゃいませんか？（ちなみに Framework Search Paths のところにはちゃんと `$(PROJECT_DIR)` って入れてるしプロジェクトディレクトリーにも出来たフレームワークのファイルをコピーして入れています）