【Swift】自動生成されたモデルをドメインモデルに入れ替えるメリット

2021-04-01

こんにちはお疲れ様です。
今日はTIPSというかメモというかそんな感じです。

サーバー側にSwaggerを利用したAPIレスポンスモデルをYAMLで作成してもらって、それをフロント側でOpenAPI Generatorでレスポンスを自動生成する環境がありました。
それのアプリ側のデバッグTIPSになります。

生成されたモデルは直利用せずドメインモデルに入れ替える

自動生成されたモデルをそのまま利用してもいいですがアプリ側でドメインモデルに入れ替えることで、Swagger値変更時にコケて差分が見つけやすくなります。
例えば以下のようなモデルが自動生成できたとします。

public struct ResUserGet: Codable { 
    public enum UserType {
        case bronze = "bronze"
        case silver = "silver"
        case gold = "gold"
    }
    public var id: Int
    public var name: String
    public var userType: UserType

    public init(id: Int, name: String, userType: UserType) {
        self.id = id
        self.name = name
        self.userType = userType
    }

}

この場合、Moyaやら何やら取得したJSONをデコードしてこのモデルを利用することもできますが、ドメインモデル変換を挟んでやります。

struct UserEntity {

    enum UserType: String {
        case bronze
        case silver
        case gold
    }
    var id: Int
    var name: String
    var userType: UserType
}

こういうモデルに入れ替える。
入れ替えるときは以下のようなTranslatorを用意するといいかも。
うちではRepositoryに変換処理を書き込んでいます。

extension ResUserGet {
    func translate() -> UserEntity {
        return .init(id: id,
                    name: name, 
                    userType: userType)
    }
}

extension UserEntity.UserType {
    init?(from value: ResUserGet.UserType) {
        switch value {
        case .bronze: self = .bronze
        case .silver: self = .silver
        case .gold: self = .gold
        }
    }
}

こうすることでパラメータの変更がされた時にパースでこけるので、見落としがなくなります。

以上メモ。