天気予報アプリをリリースしてみた
せっかくデベロッパーに登録しているので、そろそろアプリをリリースしようと思い立った。
今回は自分が実装で気をつけていることと、アプリの宣伝を兼ねて書きます。
経緯
数年前にiOS開発を始めた頃に作った「全国天気」というアプリの改良版にしようと考えた。 なぜそう考えたのかというと、単純に設計・実装力がこの数年でどれだけ伸びたのかなーというのを体感したかった。
iOSソフトウェアを開発するようになってから、Swift、Objective-Cはほぼ毎日取り組んだ。 MVCの概念すらまともに理解できずにSwiftをスクリプトのようなソースコードを書いてた初期の頃よりマシになったかなー。
概要
仕事では「汚い雑なコードを書いてとりあえず動いたからいい」ということも事情によってはやらないといけなかったりするが、今回は勉強のためなので、ガチに作った。実装する時に思い描いていることはこの数年でだいぶ変わってきた。主に以下を意識した。
もっといい書き方はないか
まずは結果を達成するための解を見つけてとりあえず書く。それができたら、簡潔な処理に書き直す。
無駄はないか
共通化できる処理はExtensionで書いたり、使いまわしたり。なんども同じ処理を書かない。
最善なパフォーマンスはどれなのか
APIから取得する値をどう処理するかによってパフォーマンスは変わってくる。保守する上でもやり方によっては機能追加が楽になる。
よくやってしまいがちなのは、Dictionaryにキー値をベタ書きにしてそのまま値を突っ込むやり方。これは実装は簡単だが、どこにどの値が入っているかわかりにくくなるため、保守が大変になる。
今回の処理の考え方としては、1インスタンスに複数の箱を用意しておき、その箱にものを詰めていくイメージ。1個の箱に必要な分を全て詰めたら次の箱をループを回して生成・詰める作業を繰り返す。全部詰めたら全ての箱をビューを保持するコントローラに渡す。
以下は処理を簡略化したもの。
var values: Array<[Any]> = [[]] //グローバル宣言 open func updateEntity(_ aValue: String) { values.append([“エリア名”]) let entity: WeatherEntity = WeatherEntity() entity.prefectureName = “都道府県名” entity.areaName = “エリア名” entity.updateDate = “日付” : : values.[area].append(entity) } (上記処理をループが完了するまで繰り返す)
データはキャッシュの概念を取り入れるため、APIから取得したデータはCoreDataに入れておく。参照時にすでに持っている場合はCoreDataから取り出し、なければAPIから取得する。
よくイメージするのは
ものを買うときにはお金が必要だが、財布にお金があれば財布から出し、なければ銀行へいきお金を下ろす。 財布にあたるのがユーザの端末、お金にあたるのがデータ、銀行はAPI、銀行へ向かうための交通費が通信費、という喩え。
スペルミスはないか
これは実装していてよく目にするのだが、スペルミスはなるべく起こらないように不明な単語は辞書を索く癖をつけている。日本語で考えて、それをプログラムに具現化する際に正しい英訳ができていないと、あとで見返した時に不整合に思えてくるため。ミスもおきやすくなる。類似処理のチェックのためにプロジェクト内検索を行うが、その際にちゃんと引っかかってくれた方が楽だし。
基本的なことだが、これらを意識できないとひどいものができあがる。
どのように振り返ったか
日記を日々つけていき、数年経った時に当時のものを見返せば、どのくらいスキルアップしたのかを定量的に測れると思います。
当時つけていた実装スキルの課題一覧をみてみたらひどすぎた(笑)
成果物
週間全国天気は以下ストアからダウンロードできます。
よろしければ使ってみてください。