CatHand Blog

アプリ開発やMac弄り

GraphQLのモデル

GraphQLクライアントライブラリのApolloを使っています。

github.com

Apolloでコードを自動生成すると、モデルがQueryやMutation毎に別に生成されます。

例えばユーザ一覧を返すQuery

query UserList {
  users {
    name
    username
    id
  }
}

と、ユーザーIDを指定してユーザーを返すQuery

query User($id: ID!) {
  user(id: $id) {
    name
    username
    id
  }
}

からSwiftコードを生成すると、 UserListQuery.Data.UserUserQuery.Data.User のようなかんじで別のmodelになります。

アプリからはこれらを同じように扱いたいことが多いと思います。

そのような時は protocol と extension を使うとうまくいきます。

protocol User {
    var name: String { get }
    var username: String { get }
    var id: String { get }
}

extension UserListQuery.Data.User: User {
}

extension UserQuery.Data.User: User {
}

↑のようなコードを追加すると、UserListQuery.Data.UserUserQuery.Data.UserUser として扱えます。