素人がSwiftでiOSアプリの開発をした際に知っておくべきだったこと

##iOSアプリ開発わけがわからない
僕は、以前までサーバーサイドのエンジニアをやっていたのですが、今年の6月から突然、SwiftでiOSのアプリ開発をすることになりました。そのときに、最初に思ったのがこの感想です。

**iOSアプリ開発わけがわからない。**

巷では、「簡単に作れるiOSアプリ！」、「10分でアプリを作ろう！」などの記事で溢れていますが、敷居が低く見せつつも、実はハマリポイントが多いです。

今、振り返って、過去の苦しんでいる自分に言ってあげたいことを今回まとめました。

## 1. 何かがおかしい。うまく動かない。
**デバッグ方法を知ろう**
#### ブレークポイント
ブレークポイントを貼ることによって、処理を途中で止めることが出来ます。
そして、その際に変数に入る値を確認することがあります。
ここまでは、他のIDEと同じだと思うのですが、値を見るのに工夫が必要です。
コンソール上で、`po オブジェクト名`と入れるとオブジェクトの状態を見ることが出来ます。
以下のような方法もあります。

参考: [XcodeのBreakPointで式の評価値を確認してデバッグに革命を起こす！](http://qiita.com/Kta-M/items/b8f6f74b3288611e7536)

必要なくなったら、ブレークポイントは外したほうがいいです。意図せず、ブレークポイント貼っているのに気付かずアプリが止まっていることがります。
コードに、`print("〇〇")`などと書いていると、消し忘れることも多いので多用するのは避けた方がいいと思います。

#### 表示崩れ
意図せず表示が崩れる事が多々あります。
そんなときは、アプリを走らせている時にstoryboard上の下にあるDebug View Hierarchyを押してみましょう。
<img width="280" alt="スクリーンショット 2016-12-12 23.03.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/506/cd2bf210-f62d-1da4-75a7-ce5d9ccd5a3e.png">

以下のように、Viewがどのような階層になっているか確認することが出来ます。
<img width="358" alt="スクリーンショット 2016-12-12 23.07.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/506/33ec7d29-9d6a-a3b6-8576-35c25b3f814b.png">

## 2. nilで警告？とりあえず「！」付けるぞ！
**駄目です。アプリが落ちます。**
Swiftでは、nilが入る可能性のある変数をOptional変数として宣言することが出来ます。
そして、その変数を宣言している際に、警告が出るため、よく考えずに、警告に従って「！」を付けることが最初は多々あると思います。
これは絶対にやめたほうがいいです。もし、その変数にnilが入った際にアプリが落ちます。
以下のコードは落ちます。

```swift
var value: Int?
value = nil
print(value!)
```

なので、警告が出た際は、以下の記事にあるようなオプショナルチェンジングや、オプショナルバインディングを適宜用いるといいです。 

参考: [SwiftのOptional(オプショナル)が少しややこしいのでまとめてみた](http://qiita.com/maiki055/items/b24378a3707bd35a31a8)

以下のように書くことが多いです。

```swift
guard let newValue = value else {
 return
}
print(newValue)

```
参考: [Swift 2.0 で追加された guard のいいところ](http://qiita.com/mishimay/items/75fb0958f33079ff0e8a)

## 3. 適当にAuto Layout制約を付けるぞ！
**駄目です。レイアウトが崩れます。次に触る人が死ぬほど苦労します。**
storyboard上で作業するときは、以下の画像の右上の警告に常に配慮しましょう。
<img width="237" alt="スクリーンショット 2016-12-12 23.27.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/506/03552146-1887-9046-dab8-71fdd7c28698.png">

黄色であれば、制約は正しいがきちんと配置されていないことが多いので、逐一、オブジェクトを選択しupdate Frameして、最新の配置情報にしましょう。コマンドは、`option + shift + =`です。

赤色であれば、制約が間違っている(そもそも足りていない or 衝突している)ので、制約を見直しましょう。ここで、結構ハマる事が多いので人に聞くことが多かったです。
ただ、エラー内容から推測することが出来ます。
以下の例だと、Y方向のpositionが決まっていないと出ているので、オブジェクトの上下の方向の制約がついていないのでは？という仮設を立てるといった具合です。

<img width="355" alt="スクリーンショット 2016-12-12 23.44.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/506/b3cb6762-8437-f959-f307-21d4588f1931.png">

エラーが出ている対象の上下左右の制約、width、heightの制約を見直してみましょう。

Add missing Constraintを押したくなる衝動にかられますが、辞めたほうがいいです。おかしな制約が入ることが多いです。

## 4. Auto layoutの制約をつける&制約を外すを繰り返す
**注意しないと、アプリが落ちます**
storyboardからコード上に、`@IBOutlet`や`@IBAction`などの制約の紐付けを行ったあとに、紐付けを解除したい際に`Ctrl + Z`などで戻ると、storyboard上には制約のヒモ付情報が残っている場合があります。紐付け解除した際は、storyboardの解除したパーツを選択し、制約が残っていないか確認しましょう。

<img width="270" alt="スクリーンショット 2016-12-12 23.18.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/506/87a3c8db-c292-fe7e-e53a-517756bc29ea.png">

コード上で削除した場合は、storyboard上でも、上の画像の×ボタンを押して紐付け解除しましょう。

## 5. Objective-Cの記事が出てきたら、「〇〇 Swift」でググり直す
**時間を無駄にします。**
Swiftは最近できた言語なので、なにかでつまずいてぐぐってもObjective-Cで書かれた記事に遭遇することが多いです。
当時の自分は、Objective-Cの記事が出てきたら、Swiftの記事をひたすら探していましたが、見つからないことも多く結構時間を無駄にします。見つからないときは諦めて、Objective-Cで書かれたものを参照しつつ、Swiftで書いてみましょう。Xcodeの補完機能を使えば、似たようなメソッド名を入れると、うまくいくことが多いです。

## 6. もっと人に聞こう
**結局はこれ**
いろいろと書きましたが、iOSアプリ開発はハマることが多く、一旦ハマったら抜け出せないことが多々あります。よく調べず周りに聞きすぎるのも問題ですが、一人で抱え込みすぎず、積極的に周りに聞いていくのがやはり近道な気がします。
自分の場合は、業務とは別に、プライベートでアプリを開発し、その中で毎日出てくる分からなかった箇所を職場の先輩にこっそり聞きまくるということもやっていました。

こんなことで、忙しい人達の時間を奪っていいのだろうか？と考えたこともありました。ただ、みなさん同じ道を通ってきているので、「そんなの調べろよ」と言ってくることは少ないです。
積極的に聞いていく or 聞ける環境に身を置く というのが重要だと思います。