超初心者のSWIFT開発 開発をしていて困ったことの解説をしていく

##初めに
SWIFT開発を始めて1週間なバックエンドエンジニアがSWIFTを触ってみて、
・何これ？
・どうすればいいの？

と思ったことを書いていきます。
同じ境遇の人が"何となく"先に進める手助けができれば嬉しいです。
※これは超初心者が自分の理解で書いて行っているので、勘違いがある可能性が高いです。


##目次
####0.まずは触るファイルを覚えよう
####1.Podsって何？
####2."_"って何？
####3."?","!"って何？
####4.Delegateって何？

※随時更新をしていきます。

##0.まずは触るファイルを覚えよう
手動で触るファイルについては以下のファイルです。
1.Podfile
2.delegateファイル
3.storyboard
4.View Controllerファイル

一旦上記が大事なファイルです。
他のファイルは・・・・まだよく用途が分かっていません。今後確認していく予定

1,2については大項目で解説しますので、後回し

####storyboardについて
これはGUIで見た目を作成できるやつです。
VB.netとかでGUIでの画面作成を使ったことがある人なら少し取っ付き安いのかな〜中身がHTMLじゃないからあんまり関係ない気がする...。

・オブジェクトを配置する
・オブジェクトをViewコントローラーと連動させる。
・オブジェクトのイベントをViewコントローラーと連動させる
　　こんな感じですかね。

本当は画像つきで解説したかったのですが、画像アップロードしようとすると、Bad Requestが出てしまうので、保留。

####View Controllerファイルについて
イメージは、コントローラーと、JSが一緒になったものってイメージです。

コントローラーの役割も担いつつ、各オブジェクトのイベントなんかも処理できるものという認識です。

例えば、JSでボタンクリックイベントに相当するイベントの処理をView Controllerで書くことができます。


上記2つのファイルは役割が何となく分かりやすかったですね。

##1.Podsって何？
正式名称は Cocoa Podsです。

これ、ほぼComposerです。
Composerを使ったことがない人向けに、Podsについて説明していきます。

Podsは、Podfileに利用したいツールを記載して、ターミナルで以下コマンドを実行すると、自動的にツールをインストールしてくれるツールです。

```
pod install
```

※記載方法はここでは省きます。沢山記載してくださっている方がいるので、そちらを参照して下さい。
最初にpod install を実行したら、以下のファイルが生成されます

・Podfile.lock
・Podsフォルダ

####Podsフォルダ
インストールされたツールが格納される場所です。

####Podfile.lock
これは、ちょっと理解が難しいです。
よく使われるpodのインストールコマンドは、大きく分けて2つあります。

・pod install
・pod update

各々について説明します。

```
pod install
```
Podfile.lockが存在しない場合（一番最初の実行など）
　・Podfileの構成を読み出してきて、ツールをインストールします。
　・現在のツール構成（バージョン等）でPodfile.lockを作成します。

Podfile.lockが存在する場合
　・Podfile.lockの構成を読み出してきて、ツールのインストールを行います。
　　※Podfileは読み出しません。　

```
pod update
```
　・Podfileの構成を読み出してきて、ツールを最新状態にしてインストールします。
　・現在のツール構成（バージョン等）でPodfile.lockを作成します。


つまり何がしたいかと言うと、開発者が複数人いる場合、同じバージョンのツール使いたいですよね？
Gitに上がっているPodfileとPodfile.lockを持ってきて、pod installと打つと、皆と同じツール構成を作ることができると言うことですな。


##2."_"って何？

```
func someFunction3(_ firstParam: String, _ secondParam: String) {
    print("First=\(firstParam), Second=\(secondParam)")
}
```

こんなやつですね。

これについて、詳しく解説してくれているサイトがありました。とても分かりやすかったです。

https://www.yoheim.net/blog.php?q=20171104

上記を読んで、理解したら以下は読まなくていいです。

"_"は「関数ラベル」と呼ばれる宣言を省略しているものらしいです。

例えば、javascriptでは、関数宣言と、関数の呼び出しは以下の様な記載をします。

```sample.js
function sampleFnc(firstParam, secondParam){
  console.log(firstParam);
  console.log(secondParam);
}

sampleFnc("最初の引数","2つ目の引数");
// consoleに　"最初の引数" "2つ目の引数"と表示される
```

これは多分皆さんも理解できるものと思います。

では、swiftではどう書くのか？

```sample.swift
func sampleFnc(firstParam: String, secondParam: String){
  print(firstParam)
  print(secondParam)
}

sampleFnc(firstParam:"最初の引数",secondParam:"2つ目の引数")
// consoleに　"最初の引数" "2つ目の引数"と表示される
```
firstParam,secondParamと記載されているものが"関数ラベルです"

関数ラベルは、別名をつけることができます。

```sample2.swift
func sampleFnc(first firstParam: String,second secondParam: String){
  print(firstParam)
  print(secondParam)
}

sampleFnc(first:"最初の引数",second:"2つ目の引数")
// consoleに　"最初の引数" "2つ目の引数"と表示される
```

こんな感じで別名で宣言をすると、別名で呼び出すことができます。

最後に、関数ラベルの別名は省略することができます。

```sample2.swift
func sampleFnc(_ firstParam: String,_ secondParam: String){
  print(firstParam)
  print(secondParam)
}

sampleFnc("最初の引数","2つ目の引数")
// consoleに　"最初の引数" "2つ目の引数"と表示される
```

"_"が出てきました。

こんな感じで使われるそうです。
つまり、"_"は何かが省略されていると言う認識で良いと思います。

（間違ってたらすみません。）


##3."?","!"って何？

```sample.swift
let str = "str"
let any = str as Any
let sampleStr = str as! String
let sampleNumber = str as! Int
```

```sample2.swift
let str = "str"
let any = str as any
let sampleStr = str as? String
let sampleNumber = str as? Int
```

まずは、asを使うことによって、キャストします。
javascriptで言うと以下の感じですね。

```sample.js
var str = "str"
//let any = str as Any
var sampleStr = String(str)
var sampleNumber = Number(str) //error
```

Any型はjavascriptでは例える感じの型がなかったので、コメントしてます。
似ている感じといえば"var"がそうなんじゃないかと・・・。

それで"!","?"についてですが、これはswift独自の考え方が介入します。
と、その前に・・・。

####アップキャスト　ダウンキャストについて
#####アップキャストについて
小さいものから大きいものに変換する方法です。

```sample.swift
let str = "str"
let any = str as Any
```

Any型は、何でも許容します。
つまり、String型だった"str"の変数をAny型に変換する（アップキャスト）します。
この場合は、コンパイルが通れば、エラーが発生することはありません。

#####ダウンキャストについて
アップキャストの逆です。
大きなものから小さなものに変換する方法です。

ここで"!","?"が活躍します。
大きなものから小さいものに変換すると、変換できないものが存在します。
それぞれをダウンキャストした時に、挙動の違いがあります。

```sample.swift
let any: Any = "abc"
let sampleStr = any as! String
//以下は変換できない
let sampleNumber = any as! Int
```
固定の型に変換します。
必ず右辺の型になりますので、変換できなかった場合は、Exceptionが発生します。

今回で言うと、Int型に変換した場合、Exceptionが発生します。

```sample2.swift
let any: Any = "abc"
let sampleStr = any as? String
//以下は変換できない
let sampleNumber = any as? Int
```

キャスト変換ですから、右辺の型に変換することは変わりありません。
ですが、Int型に変換できないので、nilになります。Exceptionは起こりません。

##4.Delegateって何？
申し訳ないですが、こちらは私は理解できていませんので、理解できたタイイミングで自分なりの解説を記載します。

一応何となく分かった気になったサイトを以下に記載します。

プロトコルとデリゲートのとても簡単なサンプルについて
https://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca

【swift】イラストで分かる！具体的なDelegateの使い方。
https://qiita.com/narukun/items/326bd50a78cf34371169