Xcodeにおけるエラーとの格闘方法まとめ[初学者向け]


開発を始めて少し経つと様々なエラーに悩まされるようになることと思います。
そんな時に必要となるのは、どんなエラーが起きているのかを把握して、それに対処していくスキルです。
今回は、Xcodeでの開発におけるエラーを把握する方法(デバッグ方法)についてまとめていきます。

#1 基本的デバッグ方法

##超基礎
### コンソールに表示されるエラー文を読もう
メッセージの意味が分からなければまずはググりましょう。
![スクリーンショット 2016-06-07 19.53.03.png](https://qiita-image-store.s3.amazonaws.com/0/36527/224ab1fb-4372-725e-96b5-0195a82e4fdb.png "スクリーンショット 2016-06-07 19.53.03.png")



### シンタックスエラーに対処しよう
コードの横に出てるエラー文を読んでググろうね
![スクリーンショット 2016-06-07 19.11.16.png](https://qiita-image-store.s3.amazonaws.com/0/36527/3040e653-2bef-5081-6287-660dde4ef045.png "スクリーンショット 2016-06-07 19.11.16.png")
上記例では「Use of unresolved identifire 'newData'」と表示されています。
意味が分からなければググる習慣を付けましょう。
ちなみにこれは、「そんな言葉定義されてないぞ！」って怒られてます。


### どんな場面でエラーが発生したのか、発生タイミングからエラー箇所を推定する
特に画面遷移時、イベント発生時に注意する。なんの操作をしてエラーが起きて落ちたのかで大体予想はつく。
プログラム実行前に、赤いマークがついているようなエラーを<strong>シンタックスエラー</strong>、プログラム実行中に何らかの操作をして落ちるエラーのことを<strong>ランタイムエラー</strong>といいます。
ランタイムエラーの場合は特に、どういった操作をした時に落ちるのか、再現性はあるのかなどをしっかり見れば、大体のエラー発生箇所が予測できます。

##基礎

###1 printデバッグ
print()を活用してコンソールに変数の値を表示しよう
メソッドが呼ばれているかどうかをprint()を使って確認しよう

|print()|コンソール画面|
|---|---|
|![スクリーンショット 2016-06-07 20.05.08.png](https://qiita-image-store.s3.amazonaws.com/0/36527/7929df06-7642-e2f9-de8f-7547ba0f4bbe.png "スクリーンショット 2016-06-07 20.05.08.png")|![スクリーンショット 2016-06-07 20.05.25.png](https://qiita-image-store.s3.amazonaws.com/0/36527/305277f9-afce-04cd-05eb-6b8c5260629e.png "スクリーンショット 2016-06-07 20.05.25.png")|



###2 ブレークポイントの活用(ただのエラーじゃないよ)

変数の値チェック、実行手順の確認とかができます。
左端の行数を表示しているところをクリックすると青いマークがつきます。これはブレークポイントと言って、その行にプログラムが到達すると強制的にプログラムをストップして、プログラムの実行順や変数の中身を確認することができます。
左下のwindowで変数の値をチェックできます。

![スクリーンショット 2016-06-07 20.09.39.png](https://qiita-image-store.s3.amazonaws.com/0/36527/da6fb699-2476-586e-9b13-598e78899287.png "スクリーンショット 2016-06-07 20.09.39.png")


###3 コンソールの活用(poコマンド)

ブレークポイントなどでプログラムを止めた場合、左下コンソールwindowに(lldb)という文字が表示されていると思います。
この時、po(print object)コマンドを使って変数の値チェックなどを行うことができます。(lldb)はブレークポイントで止めたとき以外にもnilエラーなどのランタイムエラー時に表示されます。poコマンドはブレークポイントを設定していなくても変数の値チェックができるので便利です。

```コンソールコマンド
 po monsterImageView.image
```

またpoコマンド内では、isProxyやdynamicTypeなどのメソッドも自由に使用できます。

```コンソールコマンド
 po monsterImageView.image?.isProxy()
 po monsterImageView.image.dynamicType
```

|コンソールウィンドウ|
|---|
|![スクリーンショット 2016-06-07 20.29.10.png](https://qiita-image-store.s3.amazonaws.com/0/36527/0248073f-15a8-0b36-f440-bebf0efb62ca.png "スクリーンショット 2016-06-07 20.29.10.png")|



###4 View Hierarchy

UI関連のエラー、作ったはずの部品が表示されてないとか、思ったように配置できてないってときに使います。
見た目かっこいい

プログラム実行中にDebug WindowのView Dubug Hierarchyボタンを押す(右端のやつ)
現在表示されているアプリのViewを階層ごとに分類・解析できる

|ボタン(右端のやつ)|View Hierarchy|
|---|---|
|![スクリーンショット 2016-06-07 18.23.38.png](https://qiita-image-store.s3.amazonaws.com/0/36527/e7c801b3-69de-c023-1b6d-3e3910db1748.png "スクリーンショット 2016-06-07 18.23.38.png")|![スクリーンショット 2016-06-07 18.19.05.png](https://qiita-image-store.s3.amazonaws.com/0/36527/e1334ce1-c7aa-8d65-1a46-cebf91894c6a.png "スクリーンショット 2016-06-07 18.19.05.png")| 




#2 初心者が陥りやすいエラー集

## シンタックスエラー編
文法エラーです。
Swiftの書き方が間違ってます。
ちゃんとSwiftを勉強しましょう。( Swiftはバージョンの更新が早く、文法もちょこちょこ変わっていたりするので写経をするなどしてSwiftの開発を勉強するときは要注意です。)

### if文の書き方

プログラミングを勉強し始めたころは、if文の書き方もあやふやで、エディター(Xcode)に怒られることも多いと思うのでよく練習しましょう。

```Swift
if a == 1 {
	//処理
} else if b == 1 {
	//処理
} else {
 	//処理
}
```

### オプショナル：付け足すのは!か?か、それが問題だ

SwiftにはOptionalというnil管理をするためのとても良い機能がついています。
Optionalについては以下の記事がよくまとめられています。
[[Swift] Optional 型についてのまとめ Ver2](http://qiita.com/cotrpepe/items/518c4476ca957a42f5f1)

 ```Swift
 @IBOutlet var label: UILabel //エラーになる
 @IBOutlet var label: UILabel! //UILabelの後ろに!が必要
 ```
 
@IBOutletで宣言するUIコンポーネントなどは!を付けないとXcodeに怒られます。
しかし、!型(Implicitly unwrapped optional 型)はアンラップする際にnilが入っているとランタイムエラーを起こすので要注意人物です。

## ランタイムエラー編
原因のほとんどが、正しい画面遷移先が指定されていない、UI Componentがnilになっている、nilエラー(OptionalのForced Unwrappingなど)によるものです。

### 関連付けエラー
関連付けエラーの際にAppDelegateに対してエラーマークがつくことが多いです。
また、画面遷移時に落ちる場合は遷移先のUIコンポーネント(画面の部品)がnilになっている可能性があります。
遷移先のUIImageViewがnilになっていないかどうかなどを調べましょう。

|ImageViewでnilエラーが起きてる|
|---|
|![スクリーンショット 2016-06-07 20.43.11.png](https://qiita-image-store.s3.amazonaws.com/0/36527/19c89974-b048-de33-2c87-03c758bcc18f.png "スクリーンショット 2016-06-07 20.43.11.png")|


### 画像及び音声のリンクエラー

上記パターンと同様にnilエラーが起きていることが多いです。
画像や音声ファイルが、
* <strong>きちんとXcodeプロジェクトに紐付いていない</strong>
* <strong>ディレクトリがネスト化していて、相対リンクではXcodeが認識してくれない</strong>
などが原因として考えられます。

こうしたミスを防ぐために画像ファイルは一元的に、Assets.xcassetsで管理するのをお勧めします。

|Assets.xcassets|
|---|
|![スクリーンショット 2016-06-07 20.48.18.png](https://qiita-image-store.s3.amazonaws.com/0/36527/31677d3b-7aa7-2daa-0d5a-c4a70fc3c0eb.png "スクリーンショット 2016-06-07 20.48.18.png")
|


### ブレークポイントを知らないパターン

上記ブレークポイントを知らない人が、たまにこれは何のエラーなのかと頭を悩ませている姿を見ます。ブレークポイントをしっかり使いこなしてデバッグマスターになりましょう。知らない人は調べましょう。

### is initial View
シミュレータを立ち上げた瞬間に画面が真っ黒になっている場合があります。

|シミュレータ|Storyboard|
|---|---|
|![スクリーンショット 2016-06-07 18.37.26.png](https://qiita-image-store.s3.amazonaws.com/0/36527/a9ba1633-3086-4b76-5bda-bd652d166fe3.png "スクリーンショット 2016-06-07 18.37.26.png")|![スクリーンショット 2016-06-07 18.40.25.png](https://qiita-image-store.s3.amazonaws.com/0/36527/a3cd3b15-d63f-cf13-ef82-06fbada225d7.png "スクリーンショット 2016-06-07 18.40.25.png")
|



これはStoryBoard上でis initial viewを設定していないことが原因です。


StoryBoard上で起動後最初に表示するViewControllerに対してIs Initial View Controllerにチェックをいれましょう。