swift

【APIKit】新プロトコルのCodableで通信処理を行う 応用編

APIKitと言うライブラリを用いた通信処理の実装手順と共に、Codableと言うプロトコルについての解説もしています。

基礎編ではわかりやすさを考慮して省いたとはいえ重要な部分を補足として載せておきます。クエリパラメータについての解説は役立つと思います。

補足

保持・可読性の観点から

機能

応用1. プロトコルを使ってRequestの実装をシンプルにする

QiitaAPIというプロトコルを定義し、そちらにリクエスト情報の一部を移管することでシンプルに保つことができます。

//  QiitaAPI.swift

import APIKit

protocol QiitaAPI: Request { }

extension QiitaAPI {
    var baseURL: URL {
        return URL(string: "https://qiita.com/api/v2/")!
    }
}

extension QiitaAPI where Response: Decodable {
    var dataParser: DataParser {
        return DecodableDataParser()
    }

    func response(from object: Any, urlResponse: HTTPURLResponse) throws -> Response {
        guard let data = object as? Data else {
            throw ResponseError.unexpectedObject(object)
        }
        return try JSONDecoder().decode(Response.self, from: data)  //Rssponse.self→[Article]
    }
}

定義したプロトコルQiitaAPIをFetchQiitaArticleRequestに適応させます。そうすることで必要な記述量は少なくなります。QiitaのAPIを用いたリクエストを作りたい場合もQiitaAPIを適応させることで実装を省略できます。

import APIKit

struct FetchQiitaArticleRequest: QiitaAPI {
  	//レスポンスのデータ構造
  	typealias Response = [Article]

  	//リクエスト先のurl  
    var path: String {
        return "items"
    }
  
  //httpメソッド
    var method: HTTPMethod {
        return .get
    }
}
  • whereで

応用2. リクエストヘッダ・クエリパラメーターの付与

クエリパラメータおよび

import APIKit

struct FetchQiitaArticleRequest: QiitaAPI {
    typealias Response = [Article]

	var method: HTTPMethod {
    	return .get
	}

	var path: String {
    return "items"
	}

  let query: String?
  var queryParameters: [String : Any]? {

   guard let query = query else {
       return ["page": 1, "per_page": 20 ]
   }
        return ["query": "title: \(query)"]
   }
}

応用3. エラーハンドリング

読んでいただきありがとうございます!!

記事として取り上げたトピックを体系化してまとめた内容を電子書籍として販売しています。購入していただくことで執筆の応援ができます。詳細はこちらから