11

ResponseTransformer (またはそれらのシリーズ) を使用して、オブジェクト モデル クラスを Siesta サービスから返される応答に自動的にマップし、Siesta リソースがモデル クラスのインスタンスになるようにしたいと考えています。私は 1 つのクラスの実用的な実装を持っていますが、リソース (モデル) のタイプごとに個別の ResponseTransformer を構築する前に、これを行うためのより安全でスマートな、またはより効率的な方法があるかどうかを知りたいです。

サンプル モデル クラスは次のとおりです。

import SwiftyJSON

class Challenge {
    var id:String?
    var name:String?

    init(fromDictionary:JSON) {
        if let challengeId = fromDictionary["id"].int {
            self.id = String(challengeId)
        }
        self.name = fromDictionary["name"].string
    }
}

extension Challenge {

    class func parseChallengeList(fromJSON:JSON) -> [Challenge] {
        var list = [Challenge]()

        switch fromJSON.type {
        case .Array:
            for itemDictionary in fromJSON.array! {
                let item = Challenge(fromDictionary: itemDictionary)
                list.append(item)
            }
        case .Dictionary:
            list.append(Challenge(fromDictionary: fromJSON))
        default: break
        }

        return list
    }
}

そして、このモデル タイプのコレクションまたはこのモデル タイプの単一インスタンスのいずれかを返す任意のエンドポイントからの応答をマップするために作成した ResponseTransformer を次に示します。

public func ChallengeListTransformer(transformErrors: Bool = true) -> ResponseTransformer {
    return ResponseContentTransformer(transformErrors: transformErrors)
        {
            (content: NSJSONConvertible, entity: Entity) throws -> [Challenge] in        
            let itemJSON = JSON(content)        
            return Challenge.parseChallengeList(itemJSON)
    }
}

最後に、Siesta サービスを構成するときに行っている URL パターン マッピングを次に示します。

class _GFSFAPI: Service {

    ...

    configure("/Challenge/*")    { $0.config.responseTransformers.add(ChallengeListTransformer()) }
}

モデル タイプごとに個別の ResponseTransformer を構築し、各 URL パターンをそのトランスフォーマーに個別にマッピングすることを計画しています。それが最善のアプローチですか?ところで、私は新しい Siesta フレームワークに非常に興奮しています。リソース指向の REST Networking Library というアイデアが気に入っています。

4

1 に答える 1