【初心者向け】Swift3で爆速コーディングその１(画面作成とSnippetsの使い方)

# Swift3
Swift3になって<font color="red">また</font>色々変わりました
勉強も兼ねて１記事１ソースにさっくりまとめようと思います。
Swift3の変更はリファクタリング的な内容が多く
NS〜系のクラスのプレフィックスが消えるとともにクラスメソッドが修正されたり、
~~また~~イベント登録絡みのselectorの仕様が変わったり、列挙体の書き方変わったりしてます。
（~~これ以降のバージョンでは大幅な言語の仕様変更ないといいなぁ・・・~~）

参考：[Swift Docs](https://sites.google.com/a/gclue.jp/swift-docs/)
基本的にXcode8、実機でないと使えない機能以外はPlaygroundでやっていこうと思います。
~~実機で起動するためにはApple Developer登録（有料、年会費）が必要です。~~
Xcode7以降であれば登録なしで実機ビルドできるようになっていました。
参考：[誰でも無料でiPhoneの実機を使ってiOSアプリ開発する方法](http://qiita.com/Night___/items/ebe4d55b10804db9700c)
ただし、アプリを配布したいとかになるとこれまで通り登録が必要です。

オブジェクト指向に関しては理解している前提で説明します。
なおMacOSでないと開発できません。あらかじめご準備ください。

# XCode8のインストール

AppStoreアプリよりxcodeで検索
4GB以上あるのでダウンロードする際はwifi必須です。

<img width="54" alt="スクリーンショット 2016-09-24 15.18.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/55077/987003e0-8d33-34ab-8dac-6e04cae08c87.png">

![スクリーンショット 2016-09-24 15.18.20.png](https://qiita-image-store.s3.amazonaws.com/0/55077/37280ad7-d2cc-ee63-0c24-f66cbb7dacf9.png)


# Playgroundファイルの作成

xcode8を起動します。
Get start with a Playgroundを選択

![スクリーンショット 2016-09-24 15.07.57.png](https://qiita-image-store.s3.amazonaws.com/0/55077/30446e16-bb2f-c599-2bbf-c99c05ff97dd.png)

Playgroundファイルを作成します。

<img width="957" alt="スクリーンショット 2016-09-24 15.09.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/55077/a53c515c-e7e3-7b4f-b747-aacf51227c39.png">


２画面モードにして右側のペインを開きます。  

![スクリーンショット 2016-09-24 15.11.27.png](https://qiita-image-store.s3.amazonaws.com/0/55077/35c5871a-dc07-6234-db5c-53a444ebed7c.png)

# 画面を作る

Test.playgroundファイルを次のように書き換えます。

```Test.playground
import UIKit

// UIViewController（画面の部品）
class ViewController: UIViewController {
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
}

let viewController = ViewController()
viewController.view.backgroundColor = UIColor.green


// プレイグラウンドにWindowのプレビュー表示
import PlaygroundSupport

PlaygroundPage.current.liveView = viewController
PlaygroundPage.current.needsIndefiniteExecution = true
```

UIWindowクラスはアプリのWindowです。
UIViewControllerクラスは画面のクラスです。
ViewControllerクラスはUIViewControllerクラスを継承したクラスで
画面内の挙動をメソッドをoverrideして記述します。
特に下記のメソッドは最もよく使います。

* viewDidLoad:UIViewControllerインスタンス生成時に一度のみ呼ばれる
* viewWillAppear:画面表示中に画面を開くたびに呼ばれる（ホームボタンでバックグラウンド遷移からのアプリ復帰時も呼ばれる）
* didReceiveMemoryWarning:メモリ警告の感知（このメソッドに関しては基本的に書き換えることはない）

window.rootViewControllerにUIViewControllerクラスをとっかえひっかえすることで画面遷移を実現します。

下の３行に関してはPlaygroundでプレビューを表示するための処理です。

```
// PlaygroundにWindowのプレビュー表示
import PlaygroundSupport

PlaygroundPage.current.liveView = window
PlaygroundPage.current.needsIndefiniteExecution = true
```

# プレビュー

<img width="1259" alt="スクリーンショット 2016-09-24 14.57.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/55077/fb46b912-c71d-3c51-c126-1812f64d2520.png">

背景を白にしたい場合は次のように変更してください。

```
viewController.view.backgroundColor = UIColor.white
```

# Snippets登録

右ペインの{}のアイコンをクリックします。
command+aでソースコードを全選択し、そのまま{}の領域にドラッグ＆ドロップします。

![win.gif](https://qiita-image-store.s3.amazonaws.com/0/55077/4dc4a378-3b84-6a32-4b7f-07ded43574a3.gif)

次のように登録します。

<img width="474" alt="スクリーンショット 2016-09-24 15.56.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/55077/254b494f-e4a9-357b-ffa2-43541cce36d3.png">

* Title:Snippetsタイトル
* Summary:Snippets説明
* Platform:適用プラットフォーム（iOS、OSXなど）
* Language:適用言語
* Completion Shortcut:登録したセンテンス呼び出しのキーワード

一旦ソースコードを全削除して、先ほど登録したキーワードで呼び出してみます。
![win2.gif](https://qiita-image-store.s3.amazonaws.com/0/55077/fcfcf336-74d4-b2d6-f756-caa589f152e0.gif)


このようによく使うセンテンスをまとめた機能をSnippetsと呼びます。

間違って登録した場合などはUserアイコンがついてる登録済みのSnippetsを選択してdeleteキーで削除できます。

# Snippetsのエクスポート
下記のフォルダに作成したSnippetsがファイル単位で保存されています。

```
$ls ~/Library/Developer/Xcode/UserData/CodeSnippets/
```

別のxcodeで既存のSnippetsを使えるようにしたい場合は
これらのファイルをコピーします。
Snippets自体をチームでバージョン管理しておくと便利かもしれませんね。