【swift3入門】Modelを作成しよう

はじめに

前回apiを叩いてTableViewに表示させるでapiからデータ取得をしてその結果をapiに出力するところまで行いました。
ここから新しく機能を追加していきたいところですが、その前にいくつかこの構造での問題点があるのでそこを修正していこうと思います。

前回までの問題点

問題点はどこにあるかというと、前回での取得した記事のデータであるarticles[[String: Any]]という型で扱っていたことです。

前回は記事のタイトルのみを表示させましたが今後の流れとして他の項目を表示させたりといった流れになってくると思います。
apiの返り値の構造から見てわかるようにすべての記事のデータ形式はほとんどおなじになっていてパターン化されています。

現状の[[String: Any]]型だと型的に前回実装したtitleでさえ確実に持っている保証はなく、毎回パースしてオプショナル型なのでアンラップしてという流れになってしまい、項目が増えれば増えるほどめんどくさい実装になってしまいます。

そこで今回は記事のデータはどういう構造なのかというのをしっかりと定義するということをしていきます。これがモデルです。

今回はStructを用いてArticleモデルを作成していきます。

Article.swiftの作成

まずは新しくArticle.swiftという名前でSwiftファイルを作成します。

とりあえず前回タイトルだけ表示させたので、titleのみを持つ、Articleモデルを作成して適用させていきます。

まず作成したArticle.swiftの中身はこのように書きました。

今回structを用いて書きました。実装の手順を順番に説明していきます。

プロパティの定義

Articleモデルは何をプロパティをして持っているのかを定義していきます。

このようになります。

イニシャライザの定義

プロパティが定義できたので、次は実際にどのような値が入るのかを定義していきます。
イニシャライザというのは初期化するための関数で、普段つかうメソッドは呼び出したら実行されますが、イニシャライザは初期化する際に自動的に呼ばれます。
今回でいうとプロパティを先程定義しましたが、titleはletで値が書き換わらないけど値は定義されてないのに型はString型なのでnilは入りません。なので矛盾してるようになりますが、初期化する際にそれらの値を入れた上でArticleがインスタンス化されるというようになっています。

このようになりました。initというのがイニシャライザです。
ですが、今回2つ書いています。2つの違いというと引数があるかないかが異なってきます。

こっちのほうjson: [String: Any]という引数を渡しています。
渡ってきたjsonに対してtitleにどのように値を入れるかを定義しています。
なので、入れてほしいデータを渡してそれに対してどのように当てはめるかをイニシャライザには書いています。

一方こちらは引数がありません。

中身というとtitleに関しては空文字を代入しています。
データが渡ってきていないので空にして初期化しています。

ViewControllerを書き換える

これで一旦Articleモデルの作成は完了です。

次にViewControllerを書き換えていきましょう。

このように書き換えました。

articlesの型が[[String: Any]]型から[Article]型に書き換えました。

ここではarticlesJsonのそれぞれの要素の型は[String: Any]だったのでそれを先ほど作成したArticleに変換しています。
Article(json: articleJson)と書くことでarticleJsonを先程の引数ありのイニシャライザを使用して初期化することができます。

このようにArticleに変換することで

この部分がスッキリかけるようになりました。
Articleはtitleというプロパティを持っていて型はString型と保証されているのでアンラップもしなくてよくなります。

ここで一回実行してみましょう。
前回と同じように表示されるようになると思います。

Articleのプロパティを追加

前回簡単なモデルを作成することができました。
現状ではtitleしか入ってないので他のプロパティも追加していきたいと思います。

に使いそうなものをピックアップしてArticleモデルに追加して、以下のようにしてみました。

userがさらに配列を持っていたので、新たにUserモデルを作成して、Articleのプロパティにlet user: Userのように作成するのが本来よいのかもしれませんが、今回はこのように必要そうなものだけをピックアップしたのでこのような構造にしました。

せっかくいろいろ追加してみたので現状セルにタイトルしか表示させていないのでその記事を書いたユーザー名とそのユーザーのサムネ画像が出るようにしてみようかなと思いますが、今回はここまでにして次回に回そうかなと思います。

今回のコードはこちらでも確認できるのでよかったらご確認ください。

SNSでもご購読できます。

コメント

  1. hiromi より:

    こんにちわ!!
    記事参考になります

    筆者さんが使ってるAPI client & Mapper って何ですか!?
    理由と一緒に知りたいです

    1. fukatsu より:

      ありがとうございます!
      このブログのswift入門シリーズでは、ライブラリを使うとブラックボックスとなってしまう部分もしっかり理解できるように、あえてライブラリ等は使わずに実装していました。実際にアプリを開発していく際は、API clientはAPI Kit + (Alamofire or RxSwift)、Mapperは使用していなくて、的なものとしてSwiftyJSONを使うときもあるというかんじでやっています。

      理由は、API Kitは使いやすくとても有名で使用されている方も多いからです。僕が会社で配属されたアプリがAPI Kitを使用していたというのもあります。API通信は非同期処理となるので非同期処理を扱いやすくするためのライブラリとしてAlamofireが有名かつ一般的なのでしばらく使っていますが、RxSwiftを勉強してからはRxSwiftを使うようにしています。RxSwiftは非同期処理に強く、慣れるときれいにコードを記述しやすくなるのが利点なのと、アーキテクチャとしてMVVMを採用していたのでよりMVVMらしいコードを書くときに非常に適しているからです。ですが欠点としてRxSwiftは学習コストが高いので開発メンバーに合わせて使用するかどうかは判断しています。

      Mapparを使用していないのは、ライブラリを入れすぎるとライブラリ依存になりやすいかつファイル容量が大きくなってしまうという点で必要最低限のものしか入れないようにして、Mapparに関してはなしでも事足りると判断したからです。加えてMapparを使用するとビルド時間が長くなってしまうという話を耳にしたこともあるのも理由としてあります。とはいえわりとともに誤差の範囲だと思うので、僕の場合はMapparかというと違いますがSwiftyJSONを使ったり会社の別のチームではObjectMapperを使っていたりします。

      参考になればうれしいです!

コメントを残す

*