声に出して読みたいAppleのiOSサンプルコード


![advent_calender_20.png](https://qiita-image-store.s3.amazonaws.com/0/2197/70b9f98e-d2c2-15da-a22c-1cd0c5419803.png "advent_calender_20.png")



[Goodpatch Advent Calendar 2015](http://qiita.com/advent-calendar/2015/goodpatch) 20日目の投稿です。

昨日は、[inoinojp](http://qiita.com/inoinojp) による「[Sails.jsをGruntもGulpも使わずに、アセットパイプライン環境を構築する](http://qiita.com/inoinojp/items/3b2360818febdfd87dfb)」でした。

## Appleのサンプルコードはどこにあるの?

[iOS Developer Library](https://developer.apple.com/library/ios/navigation/#section=Resource%20Types&topic=Sample%20Code) からダウンロードできます。

ただ、iOSの開発者なら当然のことのようにXcodeをインストールしているはずだと思います。
Xcodeからドキュメントをダウンロードして、[Help]-[Documentation and API Reference]から、サンプルコードのプロジェクトを直接開くことが可能です。

ちなみに、今年の WWDC2015のサンプルコードは、 [Sample Code - Apple Developer](https://developer.apple.com/sample-code/wwdc/2015/)からダウンロードできます。

## どんなサンプルコード見れば良い?

<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/c0e69f9b-e526-3e71-3b89-f99d7470f0ef.png" alt="スクリーンショット 2015-12-19 23.35.53.png" width="760">

Build RequirementsとRuntime Requirements
が極端に低いものは、今はもう使われてなかったり推奨されていない技術を使っている場合が高いです。(中には未だに使われるものもありますが)

基本的に新しめのものを見れば問題ないと思います。
あと、Revision History(更新履歴)が新しい日時のものもまだ現役で使われているものなので、ハズレがないと思います。
iOS8以降のサンプルコードはSwiftで描かれているものが増えてきました。

## UIKit Catalog (iOS)

[UIKit Catalog (iOS): Creating and Customizing UIKit Controls](https://developer.apple.com/library/ios/samplecode/UICatalog/Introduction/Intro.html)

まずは黙ってこれを見ましょう。UIKitにどのようなコンポーネントがあるのか一通り確認することができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/686aa3a3-f7bb-82a3-814f-3023dc2d7fd0.png" alt="Simulator Screen Shot 2015.12.19 23.46.16.png" width="320"><img src="https://qiita-image-store.s3.amazonaws.com/0/2197/a8d31357-506a-5acc-7f57-248ab6cc8c60.png" alt="Simulator Screen Shot 2015.12.19 23.46.12.png" width="320">


## SegueCatalog

[SegueCatalog: Customizing and Unwinding with View Controller Containment](https://developer.apple.com/library/ios/samplecode/SegueCatalog/Introduction/Intro.html)

<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/26909383-3fb4-e114-a5aa-06fcf6146f87.png" alt="スクリーンショット 2015-12-19 23.53.33.png" width="760">

Segueは、Storyboardが登場した時に一緒に追加されたViewController間遷移の遷移です。
StoryboardからSegueを設定でき、単純なものならコードを全く書かなくもOKという便利なものでした。
ただ当時は、下記の理由で全てにSegueによる遷移を使うということができませんでした。

* 戻りの遷移には使えない(Unwind segue)
	* 一つ後のiOS 6.0でサポートされた
* Storyboardを分割してしまうと使えない
	* iOS 9.0でStoryboard Referenceがサポートされ、別Storyboardへの遷移が行えるように

## AstroLayout

[AstroLayout: Building Adaptive UI with Auto Layout](https://developer.apple.com/library/ios/samplecode/AstroLayout/Introduction/Intro.html)

iPhone 6/6 Plusが登場した時に発表された Adaptive UI Designに関してのサンプルコードです。
太陽系の惑星をAutolayoutとSize classを駆使して並べて表示するサンプルなのですが、iPhoneデバイスのサイズによってレイアウトが異なります。
デバイスサイズが小さいiPhone 5だと縦横どちらにしても縦に惑星が並ぶだけですが、iPhone 6 Plusの横向きとiPadですと、斜めに惑星が並んで表示されます。

さらに、iOS 9から使える `NSLayoutAnchar` という安全で記述しやすく読み易い記法も使っています。


レスポンシブWebデザインでも、モバイルで見た時とPCで見た時のレイアウトが異なりますが、
このAdaptive UIでも、iPhone 5で見た時と、iPhone 6 Plusで見た時もしくはiPadで見たときのレイアウトを変更することができます。
単純にデバイスサイズで引き伸ばしたものでない、デバイスサイズごとに最適なUIに挑戦するのも良いでしょう。

**iPhone 6**

<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/1c9f78de-5df8-0e82-013e-a3a7042516ea.png" alt="Simulator Screen Shot 2015.12.20 0.21.07.png" width="320">
<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/02116830-3a1c-989a-65bf-cd1ee72c9d84.png" alt="Simulator Screen Shot 2015.12.20 0.21.11.png" width="568">


**iPhone 6 Plus**

<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/e6837bef-569e-ceae-d105-c4c2792de749.png" alt="Simulator Screen Shot 2015.12.20 0.21.27.png" width="320">
<img src="https://qiita-image-store.s3.amazonaws.com/0/2197/0fb8cf9b-8ad8-4c20-e6dd-ea628c53c3f0.png" alt="Simulator Screen Shot 2015.12.20 0.21.31.png" width="568">



## まとめ

実装に困ったら、Appleのサンプルコードを眺めてみるのも良いかもしれません。

## おまけ

最近見てよかったサンプルコードは、オープンソース化されたSwiftの[Swift Package Manager](https://swift.org/package-manager/)を利用したサンプルコードです。
Package Managerのサンプルコードとしてだけではなく、Swiftでどうコードを書けば良いかわかるシンプルなコードになっています。

Swift Package Managerは、[Homebrew](http://brew.sh/)を開発していた [Max Howwell](https://github.com/mxcl) が関わっていることが明らかになりましたが、他にも AFNetworkingの開発者で、[NSHipster](http://nshipster.com/)を運営している [Mattt Thompson](https://github.com/mattt) も関わっているようです。

サンプルコードは、デッキからトランプを10枚引くというサンプルです。

ちょっと見ただけでも、かなり参考になりました。


* プロトコルをふんだんに使って、トランプの強さを比較する関数を実装したり、数値を文字列に変換するのを実装
* LinuxとMac OS Xで処理の書き分け
* `mutating` を使った破壊的メソッドの実装
* カスタムタイプ(struct, class)をコンストラクタではなく、コレクションリテラルで初期化できるようにする実装
	* `let hoge: Hoge = Hoge([1,2,3])` とかではなく、`let hoge: Hoge = [1,2,3]`とかで初期化する



---

良いお年を!!

明日は、[u-16](http://qiita.com/u-16) です。お楽しみに。