Swiftを習うためのポイント

# TL;DR
G's AcademyのdevコースでSwiftを勉強するのに知っておくと良いこと。


# 書いている人のバックグラウンド
dev8期でiOSコースを選択していました。
10年ほどWeb系のプログラマをやっていてインフラからバックエンド、フロントエンド、マネージャーからクライアントとの夜の付き合いまで一通りやっていました。なんでジーズに通っているのかよく聞かれましたが、代理で説明会に行ったらめちゃくちゃ面白そうだったからです。で、めちゃ楽しいです。誤解を恐れずに言うとここは「教わる場所」ではないと考えています。週に一度数時間を4ヶ月やっただけでバリバリとプログラム書けるようになるならプログラマなんて鼻クソなわけですよ。ここは「環境」なわけです。それがなんの環境なのかは人によって違うんじゃないかなと。
**できるプログラマになるはとにかく書きまくることです**

# Swiftの授業について
完全にプロダクト指向型の授業です。
細かい文法の事は授業時間にやっている時間があまりないです。いかにプロダクトを作るか。
プログラムも当然書きますがiOSの開発はまずxcodeに慣れるのが大切です。Swiftは書いていて気持ちがいいよく出来た言語だと思いますが、まずはとにかくxcodeをいじって、ビルドして動かしてみます。

# 覚えておいたほうがいいこと
プロダクトを作るのが正義ですが、iOSの授業を受けるにあたり少しは覚えていたほうがいいことや、躓いたら参考にするリンクを載せておきます。

## コンパイル
swiftはコンパイラ型の言語です。JavaScriptみたいに書いただけでパッとその場で動きません。
書いて結果を見るためにビルドしないといけません。コンパイラが何かは下記リンク先を見て下さい。
よく分からなかったらとりあえず、アプリケーションを速く動かすために先に時間使って準備しておく行為だと思って下さい。
書いたら直ぐ実行出来るPHPやPythonなんかと比べるとswiftは同じ処理ならたいてい圧倒的に速いです。

参考リンク

- [コンパイラ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)

### Macのスペック
ビルドする時間やXcode、シミュレータの負荷を考えると本格的に開発するならマシンのスペックはできるだけいい方がいいです。
つまり`iMac Pro`は大正義！！！

## データ型
PHPやJavaScriptを使用しているとあまり意識しませんがプログラムにはデータ型というものがあります。
Swiftは型に関して厳しいです。なのでこれについては事前にチェックしておいた方がいいです。下記四つは最低でもなんだか分かったほうがいいと思います。

- Int
- Double
- String
- Bool


参考リンク

- [型安全について](https://qiita.com/srd7/items/28489a9e47b133814e8a)

## Optional型
これ分かりにくいけど、分かるとホント便利な概念です。そして、これに慣れておかないとSwiftを書くの辛いです。頑張ってください。授業で説明はありますが書いて慣れるしかない気がします。
PHPでも7.1から返値の型として近い実装がされてるんですね。

参考リンク

- [どこよりも分かりやすいSwiftの"?"と"!"](https://qiita.com/maiki055/items/b24378a3707bd35a31a8)
    - Optional Bindingはとにかくそう言うモノだと思って使ってみること。慣れるほうが先
- [Swift as!について](https://qiita.com/suisuina/items/f8639d1aee61fb0530b5)

## クロージャ
JavaScriptやPHPと同じです。クロージャが何かわからなくても書かないと先に進めません。なので、この書き方はクロージャなんだなと分かるようにはしておきましょう。JavaScriptやPHPのクロージャが分かる人は逆に書き方で悩むと思います。

参考リンク

- [【Swift】クロージャの使い方。名前の無い関数を作る。](http://hajihaji-lemon.com/smartphone/swift/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)

## delegate（デリゲート）
**重要です！** iOSのプログラミングで多用します。
でも、何やっているのかわからない。最初はそれで良いです。授業で何度か説明はしていきます。

```
hogehoge.delegate = self
```

って書かされます。よく分からないけどいいんです。自分で理解するのは中々難しいので分かっている人に聞きましょう。一番良いのは自分で１度デリゲートパターンを使って書いてみることです。

参考リンク

- [[Swift]"デリゲートデザインパターン"ってなに？](https://qiita.com/nitaking/items/d441c5aa2aceaf4fc089)



## おまけ
元々エンジニアだった人向け

### Vim
XVim2というXcodeでVimのキーバインドが使えるプラグインがあります。
インストールが面倒な上にXcodeをバージョンアップすると消えるｗ
でもVimmerはこれが無いと開発出来ないはずです！

参考リンク

- https://qiita.com/KazukiTanaka/items/3b45f1304effe3f25bf3

### 並列処理
SwiftというかiOSやMacOSは並列処理がめっちゃ簡単です。

参考リンク

- https://github.com/taichi0529/ios-practice02
- https://developer.apple.com/jp/documentation/ConcurrencyProgrammingGuide.pdf

### 参照カウント
Swiftはメモリの管理に参照カウント方式を使用しています。
なので、循環参照するとメモリリークします。
循環参照しないように参照カウントを上げない方法があります。
コードを書いていて`weak`とかよく出てくると思いますがそれです。

参考リンク

- [Swiftの循環参照問題におけるunownedとweakの使い分けについて](https://qiita.com/susieyy/items/f57f9362b8e0a89023cb)
- [Swiftの @escaping と weak/unowned の理解
](https://qiita.com/ottijp/items/e45b65263c53037af1ee)

## 体系的知識について
ジーズはプロダクト指向で授業が進みますが、エンジニアとして生きていくにはコンピューターサイエンスの基礎的な知識は必須です。
例えば、ドメインやSSL証明書の仕組み、秘密鍵公開鍵がなんなのかなどはジーズでは学びません。企画を最短で形にすることに特化しています。それは方向性として正しいと思っているし実際に成功していますが、エンジニアとしてやっていくつもりならできる限りこの辺の知識もつけておいた方がいいわけです。
基礎的な数学や、暗号化理論、シャノン、チューリングなどの話、計算量の考え方等々技術が進歩しても変わらない知識はきっと役に立ちます。
上記の参照カウントの話も、メモリ、OSの役割,ガベージコレクション等を知っていればあっという間に理解出来てしまうわけです。PHPも参照カウント使っている事をしっていればさらにはやい。

>日々新しい技術は出てきますが、それは計算速度が速くなったとか、ネットワークが太くなったとかいった状況の変化によって、さまざまある技術の中で重要とされるフォーカスが変わってきているだけであって、コンピュータの基本的な原理原則というのはこの50年くらい変わっていません。
>
>だから、コンピュータサイエンスの基礎的な知識を持っていると、最新の技術が出てきても体系の中で理解できるので、非常に効率が良い。惑わされずに済むんです。逆に表面的なことだけを学んでいると、なかなか頭に入ってこないということがあり得ます。

[まつもとゆきひろ氏が「生涯プログラマー」でやっていきたい若手に贈る3つの言葉](http://type.jp/et/feature/243)から抜粋