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


関連記事

swift

Swiftでのパーミッション取得を簡単に

1 はじめに2 準備3 実装3.1 とりあえず表示3.2 カスタマイズ4 さいごに はじめに こんにちは、nukkyです。 今回は、アプリにはつきもののユーザへのパーミッションの確認を 簡単に行えるラ ...

UserNotificationsの使い方について

1 はじめに2 UserNotificationsフレームワーク3 基本実装3.1 デリゲートの設定3.2 ユーザー許可3.3 デバイストークン取得後3.4 バックグラウンドで通知受信3.5 フォアグ ...

swift

[Swift]PDFKitでPDFの表示

1 はじめに1.1 前提条件2 PDKitの概要3 実装3.1 PDFの表示4 さいごに はじめに こんにちは、nukkyです。 以前、PDFKitを使わないでPDFを表示する方法を書きましたが、今回 ...

[Swift]忘れられがちなSFSafariViewControllerについて

1 はじめに1.1 前提条件2 SFSafariViewControllerとは2.1 SFSafariViewControllerの特徴2.2 iOS11からのCookie同期について3 SFSaf ...

swift

SnapKItをつかってコードでも簡単にAutoLayout実装

1 はじめに2 準備3 実装3.1 準備3.2 AutoLayoutを指定3.3 UIAlertControllerのカスタム4 さいごに はじめに こんにちは、nukkyです。 iOSの実装中にコー ...

フォロー

blog-page_side_responsive

2019年11月
 12
3456789
10111213141516
17181920212223
24252627282930

アプリ情報

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