はじめてのiOSアプリ開発でつまずいたポイント

はじめてiOSアプリを開発したんですが、色々つまずきポイントがあったので、列挙していきたいと思います。
ちなみに僕はプログラミング自体は経験があるので、はじめてのプログラミングではないので、
初プログラミングで初iOSアプリ開発の人がつまずくポイントとはちょっとズレるかもしれません。

# Swift4.0以降で公式ドキュメントが全面刷新されてること
2019年2月現在、Appleの公式ドキュメント探すと、日本語ドキュメントだと下記が公式です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/333454/510ff480-984f-1a54-8548-ade32ac115a2.png)
日本語訳されてるドキュメントは5つだけで、しかも微妙なチョイス……
過去のドキュメントはアーカイブされていますが、情報が古いです。
最新のドキュメント見るには英語版しかないのですが、これが結構初心者だと辛い。
2018年以降に、iOSアプリ開発に入った人は軒並み困ってるんじゃないんですか？

# ネットに上がってるサンプルコードがSwiftのバージョンアップで死にがち
Swiftは2014年に発表されてから、仕様変更が多いため、
記法がバージョンによってかなり変わっていて、ネットで上がってるサンプルコードが陳腐化してることが多かったです。

たとえば、
[「’characters’ is deprecated: Please use String or Substring directly」が出てワーニング](https://qiita.com/nkj11/items/c4056200456c44c4a78b)
とか。

ワーニングメッセージに従えば修正できるレベルならかわいいのですが、
モノによっては相当しんどい変更があって、そのたびに公式ドキュメントと格闘することになりました。

# コードをどこに書いたらいいかわからない
初歩的すぎて書くのが怖いですが、Xcodeでプロジェクト立ち上げたときはどこに書いたらいいかわからなかったです。

```swift
    override func viewDidLoad() {
        super.viewDidLoad()
        //ここに書く    
    }
```
ここに書くと、なんとなーく動きますが、全体が見えてないので、
「なんで？」みたいな気持ちになりました。
ただこれはアプリにライフサイクルがある、というのを知ったので、なんとなく納得しました。
ViewがLoadされた一番最初に呼ばれるのが、viewDidLoad()なので、
そこに何か書いてやると、アプリ起動したときに最初に動くわけですね。

（参考）
[iOS のイベント駆動をライフサイクルイベントとユーザアクションイベントにわけて理解する](http://glassonion.hatenablog.com/entry/20120405/1333611664)

# 標準クラスの継承関係がわからない
viewDidLoad()の話と少し絡むんですが、
たとえばViewControllerひとつとっても、UIViewControllerを継承していて、
（UIViewController？）UIViewControllerはUIResponderを継承していて、
UIResponderはNSObjectを継承していて……みたいな継承関係がわからなかったです。
これが正確に理解できたら、かなりiOSアプリの見通しがよくなると思うんですが、何見るのがいいんでしょうね。
色々探してるんですが、

[iOS アプリの構造がどのようになっているか紐解いてみる](http://glassonion.hatenablog.com/entry/20120507/1336320038)

こちらのサイトのレベル感がちょうどいいのですが、
この記事自体はちょっと古い情報なので、もうちょい新しめの情報が欲しいですね。。。
いいの知ってる人いたら教えてくれたら嬉しいです。

# @IBOutletがわからない
storyboardからGUI操作で、@IBOutletとか@IBActionとかをコードの中につなげられるんですが、最初これの扱いが意味不明でした。
別につなげること自体は、入門サイト見ながら、その指示に従ってやればいいんですが、
つながりを削除したいとき、片方だけ消すとコンパイル通らなくなって焦りました。

やっぱプログラミングしてるのに、GUI操作じゃないと制御できない要素があると気持ち悪い感覚があるので、
もっと詳しくなって、コードで全部制御できるようにならないかなあと思っています。
（そもそも可能なのかな？）

# Selectorが難しい
ユーザーイベントが発生したときの、selectorの指定が難しかったです。

```swift
AnyButton.addTarget(self, action: #selector(onButtonClick), for: UIControlEvents.touchUpInside)

@objc func onButtonClick(sender: UIButton) {
    //なんか処理
}
```
こんな感じでユーザーがボタン押したら、何かの処理が走る、という風にできるのですが、Selectorの書き方で詰まりました。
未だにすっきりしてない部分でもあります。

# サーバ通信が難しい
どのフロント開発でもそんなもんだとは思いますが、サーバ通信が入ると途端に難しかったです。
[はてな教科書](https://github.com/hatena/Hatena-Textbook/blob/master/swift-development-apps.md)を見ながら、ほぼサンプルコード通りにつくろうとしたんですが、
いろいろ自分のやりたいことにあわせて変更していくと、上手くいかなくなりました。
具体的に書くと、サーバからJSONじゃなくて、バイナリデータを直で受けようとしたんですが、
受けた後の処理で、どう型変換するかで詰みました。

# .gitignoreを書くのを知らなかった
これは**完全に僕が雑魚なだけ**ですが、つい最近.gitignoreというのを知りました。
iOSアプリをちょいちょい触り始めたときの悩みが、
Gitにキャッシュファイル（DerivedData）とかまでコミットしてしまうことでした。

[Swift.gitignore](https://github.com/github/gitignore/blob/master/Swift.gitignore)
Githubからこれを落として、プロジェクトのディレクトリ直下に置くと、commit時にいい感じに必要なソースだけ上げてくれます。
Githubにソース公開する際にも、見せちゃいけないデータがあるなら、
そのデータが入ったディレクトリを追記しとくと、安心して公開できます。

# まとめ
最後のgitignoreが正直一番恥ずかしいので、書くか迷ったんですが、
これ以上不幸な人を増やさないために、敢えて書きます。
独学でやってると、「知ってて当たり前」みたいなことを結構落としちゃうんですよね。

一番困ったのは、やっぱ最初に挙げた、公式ドキュメントの日本語版が軒並み死んだことだった気がします。

色々ネガティブなポイントを書いてきましたが、
iOSアプリ作ってみた時間を振り返ると、**圧倒的に楽しかったです！**
散々苦しみましたが、最後に思った通りの挙動でアプリが動いてくれたときの達成感たるや……
もっとスキルあげて、思い通りのiOSアプリをつくっていきたいです。