MoyaSugar

Swift CI CocoaPods

Moya 的语法糖。

为什么需要它?

Moya 是一个优雅的网络抽象层,它使用 enum 优雅地抽象 API 端点。但是,当应用程序变得越来越大时,它会变得非常庞大。 每当你添加一个端点时,你至少应该在 5 个地方编写代码:枚举 case,methodpathparametersparameterEncoding 属性。 这会让你一遍又一遍地向下滚动。此外,如果您想设置不同的 HTTP header fields,则应自定义 MoyaProviderendpointClosure

如果您像我一样懒惰,那么 MoyaSugar 适合您。

概览

忘记 methodpathparametersparameterEncodingendpointClosure。使用 routeparamshttpHeaderFields 代替。

extension MyService: SugarTargetType {
  var route: Route {
    return .get("/me")
  }

  var params: Parameters? {
    return JSONEncoding() => [
      "username": "devxoul",
      "password": "****",
    ]
  }

  var headers: [String: String]? {
    return ["Accept": "application/json"]
  }
}

使用 MoyaSugarProvider 代替 MoyaProvider

let provider = MoyaSugarProvider<MyService>()
let provider = RxMoyaSugarProvider<MyService>() // If you're using Moya/RxSwift

完整示例

import Moya
import Moyasugar

enum GitHubAPI {
  case url(String)
  case userRepos(owner: String)
  case createIssue(owner: String, repo: String, title: String, body: String?)
  case editIssue(owner: String, repo: String, number: Int, title: String?, body: String?)
}

extension GitHubAPI : SugarTargetType {

  /// method + path
  var route: Route {
    switch self {
    case .url(let urlString):
      return .get(urlString)

    case .userRepos(let owner):
      return .get("/users/\(owner)/repos")

    case .createIssue(let owner, let repo, _, _):
      return .post("/repos/\(owner)/\(repo)/issues")

    case .editIssue(let owner, let repo, let number, _, _):
      return .patch("/repos/\(owner)/\(repo)/issues/\(number)")
    }
  }

  // override default url building behavior
  var url: URL {
    switch self {
    case .url(let urlString):
      return URL(string: urlString)!
    default:
      return self.defaultURL
    }
  }

  /// encoding + parameters
  var params: Parameters? {
    switch self {
    case .url:
      return nil

    case .userRepos:
      return nil

    case .createIssue(_, _, let title, let body):
      return JSONEncoding() => [
        "title": title,
        "body": body,
      ]

    case .editIssue(_, _, _, let title, let body):
      // Use `URLEncoding()` as default when not specified
      return [
        "title": title,
        "body": body,
      ]
    }
  }

  var headers: [String: String]? {
    return [
      "Accept": "application/json"
    ]
  }

}

APIs

要求

Moya 相同

安装

MoyaSugar 目前不支持 Carthage。

贡献

$ TEST=1 swift package generate-xcodeproj
$ open MoyaSugar.xcodeproj

许可证

MoyaSugar 基于 MIT 许可证。 有关更多信息,请参见 LICENSE 文件。