iOS

Moya vs APIKit

投稿日:2019年11月5日 更新日:

はじめに

こんにちは。カイザーです。今回は、iOSでWebAPIクライアントを実装するときに使用できるライブラリである「Moya」と「APIKit」を比較して紹介したいと思います。
私は、普段APIKitを好んで使用しますが、Moyaの調査も兼ねて、比較したいと思います。

MoyaとAPIKitの概要

両者ともに、APIクライアントを実装するための、ラッパライブラリとなります。

Githubの比較

Moya APIKit
リポジトリオーナ Moya ishikawa
Star数 11.4k 1.7k
Swift 5.1(v14.0.0-betaで対応) 5.0(5.0.0で対応)
コントリビュータ数 188 30

記事作成時点(2019年11月)では、このようになっています。初回コミット時期に大きな差はありませんが、Moyaの方がコントリビュータ数が多いです。
しかし、Code frequencyを見てみると、近年はどちらも大きな変更が加えられていないことが分かります。
記事作成時点では、どちらもメンテナンスされており、Swift 5に対応しています。

機能比較

Moya APIKit
リクエスト定義 enum+extensionもしくはenum+structで、指定プロトコルに従って定義 struct+extensionで、指定プロトコルに従って定義
レスポンスJSONパーサ 標準でDecodableをサポート 標準はDictionaryに変換されるが、プロトコル実装によりDecodableサポート可
ラップしている通信クラス Alamofire URLSession
Rx Extension サポート なし
サンプルレスポンス サポート なし
依存ライブラリ Alamofire
ReactiveMoya
ReactiveSwift
Result
RxAtomic
RxCocoa
RxMoya
RxRelay
RxSwift
Result

最も異なるのは、「ラップしている通信クラス」だと思います。MoyaはAlamofireをラップしているため、Alamofireの便利な機能や拡張を使用することができます。

また、Moyaは「サンプルレスポンス」も特徴的です。これは、実際に通信せずに、定義されたモックJSONを、コールバックするものです。UTやUIテストでのパターンもに使えそうです。

APIKitは、シンプルで軽量であることが特徴ですね。APIKitは最低限の機能しかありませんが、多くはプロトコル指向による設計となっているため、カスタマイズしやすくなっています。

Rxに依存したアーキテクチャを組み、自動テストにも取り組むつもりであれば、Moyaがおすすめですね。
一方で、スピード重視で最低限の機能を開発していきたい場合には、APIKitがおすすめです。

実装の比較

それでは、実装面を比較していきたいと思います。今回は、livedoor天気情報APIを使用して、東京の天気をログ出力してみます。

リクエスト定義

Moya

APIKit

基本的にどちらも定義プロパティは似ていますが、異なる点について紹介していきます。

  • 送信パラメータは、Moyaではenumの引数に設定するのに対し、APIKitではstructのプロパティとして設定します。
  • Moyaはenum caseをAPIの本数文増やし、extensionで分岐しながら定義していきますが、このままだと分岐だらけになってしまいます。そのため、APIKitのように、APIごとにstructで実装することも可能です。
  • Moyaではリクエスト定義時にレスポンス型は定義しませんが、APIKitではtypealiasで設定します。
  • APIKitはDecodableは標準でサポートされていないため、JSONDecoderを使用するDataParserを定義しています。

レスポンスstruct

Moya, APIKit共通

今回は、Moya, APIKit共にJSONDecoderを使用してパースするため、レスポンスstructの実装は共通となります。

リクエスト送信

Moya

APIKit

こちらも似ていますね。
Moyaは、responseに map(Decodable.Protocol) が実装されており、ここにDecodableの型を指定するだけで、パースされます。
このパース部分が隠蔽されていないことが気になりますが、ここがRxでチェインされるネットワーク層であれば、うまく隠蔽できると思います。
この点からも、MoyaはRxと組み合わせると強力になることが分かります。

出力結果

以下のような出力用関数を用意しました。

Moya, APIKit共に、以下のように出力されました。

さいごに

Swiftではプロトコルやジェネリクスのサポートが強力であるため、自前でも簡単にAPIクライアントを作成できます。しかし、実際に作ってみると、紹介したライブラリと同じような機能になることは多いのではないでしょうか?
そうであれば、MoyaやAPIKitの導入を検討してみても良いかもしれません。

おすすめ書籍

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus 詳解 Swift 第4版 [改訂新版]Swiftポケットリファレンス (POCKET REFERENCE)

blog-page_footer_336




blog-page_footer_336




-iOS
-, ,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

CollectionViewの並び替えを実装する

1 はじめに2 実装方法3 手順4 ロングタップの実装5 並び替えを可とする6 並び替え時のデータ処理7 次回表示時8 他に9 さいごに10 おすすめ書籍 はじめに こんにちは。Yossyです。 前回 ...

[Swift]AlamofireでファイルのUploadをしてみる

1 はじめに2 CarthageでAlamofireを導入する2.1 CartFileの作成とライブラリのダウンロード2.2 Xcodeの設定3 Alamofireとは3.1 AlamofireのHT ...

swift

Swiftの「UIActivityViewController」でTwitterにだけハッシュタグをつけたい!

1 はじめに2 実装2.1 まずはやってみよう2.2 Twitter連携時のみにハッシュタグをつけたい3 さいごに はじめに こんにちわ、nukkyです。 今回はSNSやメール連携したいときに便利な ...

swift

Swift3で動的にUIViewを切り替える Part2

1 はじめに1.1 前提条件2 完成イメージ3 StoryBoardの準備3.1 Viewの配置3.1.1 ① Segmentを配置するView3.1.2 ② ContainerViewを表示するVi ...

【Swift】iOS13.1、Xcode11でSceneDelegate周りを触ってみた。

1 はじめに2 SceneDelegateについて3 SceneDelegateの呼ばれる順番3.1 アプリ起動時3.2 アプリバックグラウンド3.3 アプリフォアグラウンド3.4 アプリフォアグラウ ...

フォロー

blog-page_side_responsive

2019年11月
 12
3456789
10111213141516
17181920212223
24252627282930

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。