Skip to content

Instantly share code, notes, and snippets.

@jgable
Created June 12, 2014 19:55

Revisions

  1. jgable created this gist Jun 12, 2014.
    88 changes: 88 additions & 0 deletions derived.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    // Playground - noun: a place where people can play

    import Cocoa

    // Base class for parameters to POST to service
    class APIParams {
    func getData() -> Dictionary<String, AnyObject> {
    return Dictionary<String, AnyObject>()
    }
    }

    // Base class for parsing a JSON Response
    class APIResult {
    func parseData(data: AnyObject?) {

    }
    }

    // Derived example for a login service
    class DerivedAPIParams: APIParams {
    var user = "some@one.com"
    var pass = "secret"

    // THIS METHOD IS CALLED CORRECTLY
    override func getData() -> Dictionary<String, AnyObject> {
    return [ "user": user, "pass": pass ]
    }
    }

    // Derived example for parsing a login response
    class DerivedAPIResult: APIResult {
    var success = false
    var token:String? = ""

    // THIS METHOD IS NEVER CALLED
    override func parseData(data: AnyObject?) {
    /*
    self.success = data!.valueForKey("success") as Bool
    self.token = data!.valueForKey("token") as? String
    */

    self.success = true
    self.token = "1234"
    }
    }

    class APIOperation<TParams: APIParams, TResult: APIResult> {
    var url = "http://localhost:3000"

    func request(params: TParams, done: (NSError?, TResult?) -> ()) {
    let resultHandler = { (error: NSError?, response: NSHTTPURLResponse?, data: AnyObject?) -> () in
    if (error) {
    done(error, nil)
    return
    }

    let parsed = self.parseResult(data)

    done(nil, parsed)
    };

    let paramData = params.getData()

    // ... snip making a request to website ...

    let result = self.parseResult(nil)

    done(nil, result)
    }

    func parseResult(data: AnyObject?) -> TResult {
    var result = TResult.self()

    // This should call the derived implementation if passed, right?
    result.parseData(data)

    return result
    }
    }

    let derivedOp = APIOperation<DerivedAPIParams, DerivedAPIResult>()
    let params = DerivedAPIParams()

    derivedOp.request(params) {(error, result) in
    if result? {
    result!.success
    }
    }