iOSエンジニアがAndroidに転身して1ヶ月目の感想

##### 今回はiOSエンジニアがAndroidに転身して感じた障壁などを紹介していきます！

まず大きな違いとして挙げられるのが
 - プログラミング言語
 - 開発ツール

の２つです。

### 言語の違い
言語はiOSではobjective-Cと2014年からswift、AndroidではjavaとC++と2017年からkotlinが使用されています。
自分はswift⇨kotlin,javaへの移行だったのですが、今のところ文法的にはほぼ同じと感じていて移行はしやすいと思います。

### 開発ツールの違い

開発ツールはiOSではXcode、AndroidではAndroid Studioでの開発となります。
ここでの大きな違いはviewの扱いです。
iOS側でのxibファイルとAndroid側でのxmlファイルの扱いの違いを意識できるまではだいぶ開発に苦戦しました。
iOS側xibファイルではドラック＆ドロップなどでviewに直接buttonやtextを置くことができ、頭の中にあるデザインをそのままviewに反映するのが非常に楽でした（というかそれが普通だと思っていました）。
一方、Android側xmlファイルでのviewの編集は主にコードベースです。こちらの方が主流なのかもしれませんが、swiftが業務で初めて扱った言語だった自分には慣れるまでかなり辛かったです。
- iOS: viewに何を置くか決める⇨置きたい場所にドラック＆ドロップする⇨オブジェクトの詳細設定をいじる
- Android: viewに何を置くか決める⇨オブジェクトの詳細設定をいじる⇨置きたい場所に配置できるようにコードで指定する

まとめると主に上記のような手順の違いが発生するように思います。

### ライフサイクルの違い
| iOS | Android(Fragment) |
| --- | --- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2901058/3df8671d-2754-e0fb-0e3e-9e731cde33f4.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2901058/d08bfbf0-01b4-6fe4-6699-68b01fb623c2.png) |
| 参考文献:https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d　| 参考文献：https://qiita.com/chibi929/items/78f0d3aa2ab4a0229978 |

##### ライフサイクルの概念自体に大きな違いはないように感じました。
ただそれぞれの起動タイミングにおけるライフサイクル名が違うだけで、覚えてしまえばこれといってどちらかが使いにくい、使いやすいなどの違いはないです。

##### ライフサイクルは変わらないのですが、一つここで注意しなければならないのはその基本構造に違いがあることです。
| Android(Activity) | Android(Fragment) |
| --- | --- |
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2901058/1434ab5a-8268-c14a-0bfc-5512f55f6624.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2901058/d08bfbf0-01b4-6fe4-6699-68b01fb623c2.png) |
| 参考文献:https://qiita.com/chibi929/items/78f0d3aa2ab4a0229978　| 参考文献：https://qiita.com/chibi929/items/78f0d3aa2ab4a0229978 |

iOSではViewControllerが全てのviewの描画や画面の遷移などを担いますが、Androidではそこの概念が全く異なりActivityという画面遷移やアクションバーの処理を中心に担う基盤があり、その上にviewの描画を担うFragmentが乗っかっているようなイメージです。このあたりに関してはまだ詳しく理解できていないので教えてほしいところです…

### サーバーとのやり取りの違い

※この項目ではiOS側をMVP構造、Android側をMVVM構造で開発していることを前提に説明していきます。

iOS側(MVP)ではmodelとしてサーバーとのやり取りをするためのファイルを作成して、viewと繋ぐためにpresenterを用意して、疎結合に構成していくと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2901058/7b9673ea-914d-6875-060d-14bb82391021.png)
参考文献：https://qiita.com/onishi_820/items/b5d08168322a036a0fea

Android側(MVVM)でpresenterにあたる部分がviewModelかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2901058/c59cd01f-0296-3d2f-0b4c-7dc64dff5424.png)
参考文献：https://goat-inc.co.jp/blog/1324/

この二つに関して言えば圧倒的にviewModelの方が使いやすいかと思います。その理由にliveDataという機能が挙げられます。iOS側にもこういった機能があれば是非教えてほしいです。
このliveDataという機能は、変数の中の値が変わる時に変化を検知してFragment側のアクションを呼び出せる機能です。
この機能のおかげでサーバーからデータを取ってくるだけであとは勝手に動いてくれるような感覚で開発を進めることができています。

### その他の違い
その他の違いとしては主に
- 文字列の管理方法
- デフォルトリソースの有無

の２つが挙げられあます。

##### 文字列の管理方法に関してはAndroid側ではstring.xmlというファイルにまとめて文言を保存しています。
そこから呼び出すようにしないと黄色警告が表示されます。ビルドできないわけではないですが、別ファイルから呼び出すのが一般的らしいです。
iOS側ではファイルにまとめなくてもそのまま必要な場所で好きな文字列を代入できますが、Androidのようにファイルにまとめておく方が変更が後から楽になってくることが想像できたので魅力的に思いました。

##### もう一つがデフォルトリソースの有無です。
iOS側にはXcodeが用意してくれているpng画像がいくつかあり、英語でそれっぽいのを検索するだけでそれっぽい画像が出てきてそのままviewに適用できます。一方Android側ではデフォルトでは用意されておらず、全部画像を作成してあてていかなければいけません。ただこれに関しては、iOS側のデフォルトリソースはデバイスのバージョンによって表示されたりされなかったりするのであまり多用できません。結局は画像を一枚一枚作成してあてていくのが一番いいのかなと思いました。

### 最後に

今回はiOSエンジニアだった自分が1ヶ月Android開発に携わらせていただいた上での感想をまとめてみました。まとめてみるといろいろ違うところがあったんだなと復習になってとてもよかったです。まだまだ学びたてで至らないことばかりなので、間違っていることや、これから学ぶべきだなと思うことなどがあれば教えていただきたいです…
最後まで読んでいただきありがとうございました。