iPhoneアプリ開発者を教育するための記事

# はじめに
iPhone開発の方法を人に教える時にどんな風に教えれば良いかをちょっと考えて、実践してみたのでその方法をここに残しておきます。
まだ教育方法が確立していない方の参考になればと思います。

また、現在の業務ではストーリーボードを使用しているコミュニケーション系のアプリを作ってますのでその観点での教育方法です。
（個人的にはストーリーボードはあまり好きでは無いが、現場の方針があるため仕方なく使ってます・・・）

この記事はXCodeを使った事が無い新人〜３年目くらいの人に基礎的な概念を身につける事を目的としています。

SwiftでもObjective-cでも通じる教育方法です。
熟練者の方が新人教育して使用してもらえると嬉しいです。
解答は敢えて載せてませんので、熟練者の方が確認してあげてください。

# 1. ナビゲーションバー

## 課題
`Single View Application`でプロジェクトを作り、ナビゲーションバーを設置せよ

## この課題の狙い

* 検索能力を確かめる
* ストーリーボードの使い方を学ぶ。

初めて新しい技術を覚える人には必須の能力は`検索能力`だと思います。
Googleなどを使えば課題の内容を聞けばすぐに解決できるものですが、検索能力の低い人はこの問題すら解決できません。
それをまずは見分けるためのものになります。

また、ストリーボードを使うと簡単なアプリならすぐに作る事ができそうだという事を意識づけれれば新人のモチベーションが上がるはずです。

この時にナビゲーションバーにタイトルをつけれる新人は筋がいいです。

# 2.コンポーネントの配置と画面遷移

## 課題
ボタンを配置して、そのボタンをタップしたら次の画面を表示せよ
また、ナビゲーションバーを使用して遷移した画面から戻ってこれるようにせよ

## この課題の狙い

* コンポーネントの性質を理解してもらう
* Segueを理解してもらう
* 気が利いた実装ができるか確かめる

ちょっと調べればできる画面遷移です。
戻る処理は何もしなくても実装される事も理解してもらいます。
ただし、その際にユニバーサルアプリの事まで調べて行える人なのかそれともそういうユーザビリティを意識でき無い人なのかを見極めます。

この時にユニバーサルアプリの意識ができる人は相当筋が良い新人なので、大切に育てていきましょう！

# 3.IBOutlet/IBActionとNSLog(print)

## 課題
初めの画面にテキストフィールドを配置して、次画面に遷移する際にテキストフィールドに入力したをログとして表示せよ

## この課題の狙い

* 実際にバグが発生した時に調査する簡潔な方法を理解してもらう
* ストリーボードとプログラムの連結方法を理解してもらう
* 出続けるキーボードを隠す処理をどこかに入れるか確かめる

この課題から一気にレベルが上がります。多めに時間をとってあげましょう。
また、できるだけ自分で調べさせましょう。難しいと言っても文献はゴロゴロしている内容なので自分自身で調べればできる内容です。

IBOutletやIBActionの連結はストーリーボードを使用して業務を進めていく上では必須の知識です。それを身につける事がこの課題の狙いです。

ただし、nonatomicやweak/retainについては課題ができた時点で教えてあげてください。
Objective-cやSwiftで開発を行う以上`weak/retain`は必須の知識になります。
僕もその記事を書いてますので良ければ[こちら](http://qiita.com/syou007/items/51f2342850e408739cc9)を参考にしてください。
（`atomic`属性を使う事は稀なケースなので、nonatomicに関しては、必ず`nonatomic`を使ってくださいと言うだけで十分です。）

この課題ができた時点で、次画面へ遷移して戻ってきてもキーボードが出続けている事に気づく人は筋がいいです。（シミュレーターを使ってるとそもそもキーボードがでない場合があるのでそれはしょうがないです。）
その場合はキーボードの隠し方を教えてあげましょう。

# 4.テーブルの配置

## 課題
次画面にテーブルのコンポーネントを追加してなんでも良いので表示せよ

## この課題の狙い

* UITableViewの使い方を理解してもらう

iPhoneアプリを作る上ではほとんど避けて通れないのがUITableViewです。
しかもHTMLのTableタグとは違い実装方法が煩雑です。
この煩雑な仕組みを肌で感じてもらう事が狙いです。

この課題自体を何も聞かないでできる新人はあまりいないと思いますが、ここは厳しく突き放して調べてもらいましょう。

出来上がった後になぜこんなに煩雑な仕組みをしているかを説明してあげてください。
iPhoneのUITableViewはメモリ節約のためCellを使いまわしている事が理解できれば、この煩雑な仕組みにも抵抗が減るでしょう。
また、画像などの遅延ロードができるという特性を持っている事も重要なポイントです。

# 最後の課題

## 課題
前画面に設置したテキストフィールドの文字列をカンマ区切りで分割して、次画面のテーブルに表示せよ

## この課題の狙い

* prepareForSegueの使い方を理解してもらう
* クラスのpublic属性とprivate属性を理解してもらう
* 画面生成された際に呼び出されるメソッドの順番を理解してもらう
* 簡単な文字列操作プログラムを理解してもらう

この課題は画面遷移する際にデータを受け渡す方法を学んでもらいます。
staticフィールドを使って受け渡す事もできますが、この方法を業務で使うとバグの原因になりますのでNGです。（これで作った人はそれはそれで正解ですが、アプリの品質が落ちる事を説明してあげましょう。また、使う局面に関しても説明してあげると今後に繋がります。）

`prepareForSegue`を使って行う事が理想ですがnavigationControllerの`pushViewController`で受け渡していてもOKです。
これはこれでアプリの性質を理解しているかと思います。
（xibで行う場合はこの方法になるはずなので、概念の理解は正しくできていると思います。）

objective-cにもPublic属性とPrivate属性がある事を理解してもらいましょう。
Swiftの場合はJava等の言語とあまり変わらないのですが、Objective-cは変数をヘッダファイルに書いた場合はPublicとなり実装ファイルに書いた場合はPrivateになります。
また、メソッドも同様です。
この概念を理解しないと全てヘッダファイルに書かれてしまいますので丁寧に教えてあげましょう。
（#importについてもどこに書くべきかの基準を一緒に教えてあげると良いでしょう。）

viewDidLoad/viewWillAppearの違いを理解してもらいましょう。
今回はどちらに実装しても問題ありませんが、この違いが問題になる事がありますので課題ができた後に説明してあげましょう。

文字列操作プログラムはおまけです。
ここまでできる人ならさほど苦労をしないで実装できるでしょう。

# 最後に
この課題を発展させてUITableViewをタップしたらアラートを出させたり、Cellを拡張させたりとしていき現場に合わせた成長をさせてあげてください。

また、これからアプリを作る場合はSwiftの方が圧倒的に理解しやすいと思いますので現場が許すならSwiftで進めることをお勧めします。

簡潔ですが、教育の手助けになればと思います。

# TownSoftもよろしくお願いいたします。
僕は[TownSoft](http://townsoft.jp)という屋号で仕事をしている個人事業主です。
一括請負、プログラマー、マネジメント等の仕事をしてますので、良ければご連絡ください♪