iOSエンジニアから見たAndroidアプリ開発とiOSアプリ開発の違いについて説明します

# 概要

iOS開発歴5年のエンジニアが仕事で必死こいて半年ぐらいAndroid開発にアサインした後の
感想を述べたいと思いました。

## AndroidとiOSとの開発スタイルの違い

iOSエンジニアがAndroid開発に着手する時につまずいたポイントとして

- UIデザインの設計・UIKitの扱いかた
- Optionalの扱い
- Resourceファイル
- ActivityとFragmentとの違いと使い分け
- layoutファイルの取り扱い

このポイントを抑えれば大規模でも最初の3ヶ月は乗り越えられると思います(楽観)。  
ResourceファイルはソースコードからのColorの変更も含まれています。

上記5点を乗り越えると若干楽になると思いきや、
次の大きな壁というか細かい違いとしては、

- UIデザインの設計の仕方
- 言語仕様
- ライブラリの追加とimport
- Optionalの取り扱い
- IDEの機能
- 変数宣言について
- Resourceファイルについて
- UIKitの扱い
- アプリのライフサイクル
- Viewのライフサイクル
- 配列や型の取り扱い(List, Array, ArrayListとかナンジャラホイ)

これぐらいかなと思いました。
これらに慣れてやっとiOSエンジニアとしては安心してAndroid開発ができるようになりました。

ではそれぞれ見ていきます。

### UIデザインの設計・UIKitの扱いかた

| iOS | Android |
| -------- | -------- |
| UILabel   | TextView   |
| UIButton   | Button / ImageButton / etc  |
| UIImageView  | ImageView   |
| UIView   | View   |
| UITextView   | TextView   |
| UISwitch   | Switch   |
| UIWebView   | WebView   |
| UITableView   | ListView   |
| UICollectionView   | RecyclerView   | (厳密に言えば違います。)
| UIScrollView(縦スクロール)   | ScrollView   |
| UIScrollView(横スクロール)   | ViewPager |

だいたいこんな感じでしょうか。
これぐらいのポイントを押さえておけば良いのではないでしょうか。

ただ、iOSのデザインはコードから生成する設計パターンとStoryboardやxibで構成を考えるなど
数パターンのやり方があります。それに対してAndroidの場合はXMLファイルを編集するパターンぐらいしか思いつかないです。

なので、デザインの設計パターンで悩むことは少ないはずです。
逆にAndroidエンジニアの方がiOSを触る場合はAutolayoutという大きなハードルがあります。
そのため、 iOS -> Android は開発の抵抗は小さいと思いますが、 Android -> iOS は
かなりしんどいのではないかと推測してます。

あと、AndroidはKotlin / Javaなのでポインタを意識するコストがないのが大きなメリットでした。
アプリ開発にポインタが関わってくると挫折率が大きくなりますね(経験談)。

### Optionalの扱い

私はOjbc → Swift → Java → Kotlin の順番で言語を学んでいきましたが、
何と言ってもJavaのOptionalの扱いが非常に大変でした。  

SwiftのOptionalに慣れた後にJavaを書くと一発で「Optionalメンドクセー」ってなるくらい。
それぐらいSwiftのOptional が大変すごいのですね。

Optionalの書き方に慣れたらあとは普通ではないでしょうか。

### Resourceファイル

iOSのリソース管理はアプリ単位でバラバラですが、Androidは「こうしなさい」というガイドラインが
決まっていますので悩む必要があまりありませんでした。
ただ、ColorやImageファイルをResourceから参照する書き方が数種類あるので、
設計によって書き方を忘れてしまうというデメリットがありました。  
もう大変ですね。  

[Android開発、RGB、16進数、リソースファイルからの色の実装についてをまとめてみた](https://qiita.com/tamappe/items/d69009dcabbb96c5802e)

[Android開発、RGBカラーからHSVでの明度(Bright)調整](https://qiita.com/tamappe/items/1ab3c6536c2365ae1260)

ただ、Androidのデメリットは角丸やドロップシャドー、枠線、グラデーションを実装するときは
いちいちXMLファイルを作成して設定する必要があるのでそのXMLファイルの管理が非常に大変で、
逆にiOSがかなり優秀でした。

できればiOSみたいに2,3行のコードでサクッと実装できるようにしてほしい。
iOSのノリで枠線や角丸・ドロップシャドーの依頼を受けてしまうと後悔することが多かった。
XMLファイルを作成していたらファイルで容量食いませんか？

アニメーションは言わずもがなiOSの方が優秀で、Androidはあまり関わりたくない印象になっています。
最近のAndroidに`MotionLayout`が加わり実装するためにはXMLファイルの準備が必要なのですが、
そんなことはコードだけで実装できるようにしてほしい。

[MotionLayout (Android Developer)](https://developer.android.com/reference/android/support/constraint/motion/MotionLayout)


### ActivityとFragmentとの違いと使い分け

Android Studio1.0 からちょこっとずつAndroidの開発に携わっていましたので、
`Activity`の概念は理解していましたが、`Fragment`の理解が大変でした。
(当初は他のAndroidエンジニアも同じ意見が多かったらしいが)

ただ、これは理解すると簡単で、iOSエンジニアに伝えるとしたら
UIViewの`Xib`ファイルみたいなものです。
(Activityは`UIViewController`に該当するクラスです)

そうとわかれば後の設計方針はほとんど同じです。
`Viewにライフサイクルが加わったもの`と教わるらしいですが、
`Xib`と`UIView`を繋げた後のアレと同じです。

そこに行き着くまでが大変でした。


### layoutファイルの取り扱い

例えを言いますと、

AndroidのLayoutファイル = iOSのAutoLayout

と同じような感じです。
こう言えば、伝わりやすいかと思いました。

Androidには部品の置き方がどのLayoutを使うかで設計方針が変ります。
が、Layoutの使い方を間違えるとXMLファイルがごちゃごちゃします(経験談)。
LinearLayout(`Vertical`)と考えたらiOSエンジニアは「あー、部品の縦向きの制約ね」と解釈します。

それが勘違いの元に繋がります。

考え方がだいぶiOSと違いましたので、
XMLでlayoutを配置するのはなかなか頭が疲れる作業でした。

ここを超えたらAutoLayoutが必要ない分、Androidの方がデザイン設計は簡単です。
回転後のマージンもしっかりやってくれます。


## 終わりに

こんな感じで半年ぐらいAndroidの開発をやってみた感想をまとめてみました。
ここの部分を超えたらiOSエンジニアもAndroidをカバーできるようになっていると思います。
(あー、他にもクロージャーvsラムダ式の対比がありましたね。)

iOSエンジニアでAndroid 開発もちょっとやってみたいけど怖いよな〜、
と思っている方でしたら今回の記事で越えるべき壁が見えるはずです。
ここを重点に置けば割とサクッとAndroidができるようになります。