Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introducing APIKit

Introducing APIKit

Yosuke Ishikawa

March 12, 2015
Tweet

More Decks by Yosuke Ishikawa

Other Decks in Technology

Transcript

  1. Introducing APIKit

    View Slide

  2. View Slide

  3. ͜͏͍͏APIΫϥΠΞϯτΛ
    SwiftͰॻ͘ͷ͸΋͍ͬͨͳ͍

    View Slide

  4. let path = "/search/repositories"
    let parameters = [
    "q": "APIKit",
    "sort": "stars",
    "order": "asc",
    ]
    GitHub.call(.GET, path, parameters) { JSON, error in
    if error != nil {
    println("error: \(error!.localizedDescription)”)
    } else {
    self.repositories = /* model object from JSON */
    }
    }

    View Slide

  5. let path = "/search/repositories"
    let parameters = [
    "q": "APIKit",
    "sort": "stars",
    "order": "asc",
    ]
    GitHub.call(.GET, path, parameters) { JSON, error in
    if error != nil {
    println("error: \(error!.localizedDescription)”)
    } else {
    self.repositories = /* model object from JSON */
    }
    }
    ✗ ΤϯυϙΠϯτ͕ଘࡏ͢Δ͔ෆ໌

    View Slide

  6. let path = "/search/repositories"
    let parameters = [
    "q": "APIKit",
    "sort": "stars",
    "order": "asc",
    ]
    GitHub.call(.GET, path, parameters) { JSON, error in
    if error != nil {
    println("error: \(error!.localizedDescription)”)
    } else {
    self.repositories = /* model object from JSON */
    }
    }
    ✗ ύϥϝʔλʔʹ
    ԿͰ΋ಥͬࠐΊΔ

    View Slide

  7. let path = "/search/repositories"
    let parameters = [
    "q": "APIKit",
    "sort": "stars",
    "order": "asc",
    ]
    GitHub.call(.GET, path, parameters) { JSON, error in
    if error != nil {
    println("error: \(error!.localizedDescription)”)
    } else {
    self.repositories = /* model object from JSON */
    }
    }
    ✗ ྆ํoptionalͳͷͰ4ύλʔϯ

    View Slide

  8. let path = "/search/repositories"
    let parameters = [
    "q": "APIKit",
    "sort": "stars",
    "order": "asc",
    ]
    GitHub.call(.GET, path, parameters) { JSON, error in
    if error != nil {
    println("error: \(error!.localizedDescription)”)
    } else {
    self.repositories = /* model object from JSON */
    }
    }
    ✗ ྆ํoptionalͳͷͰ4ύλʔϯ
    JSON Error
    .None .None
    .None .Some
    .Some .None
    .Some .Some

    View Slide

  9. “Swift is a type safe language.”

    View Slide

  10. APIKit

    View Slide

  11. “A networking library for building
    type safe web API client in Swift.”

    View Slide

  12. “A networking library for building
    type safe web API client in Swift.”

    View Slide

  13. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }

    View Slide

  14. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ ΤϯυϙΠϯτ͕ิ׬͞ΕΔ

    View Slide

  15. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ ύϥϝʔλʔΛܕͰ੍ݶ

    View Slide

  16. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ ύϥϝʔλʔΛܕͰ੍ݶ
    ✓ enum΋࢖͑Δ

    View Slide

  17. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ ݁Ռ͸2ύλʔϯ

    View Slide

  18. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ ݁Ռ͸2ύλʔϯ
    ✓ ໢ཏੑ΋໌Β͔

    View Slide

  19. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ unwrapͤͣʹ
    ஋ΛऔΓग़ͤΔ

    View Slide

  20. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ unwrapͤͣʹ
    ஋ΛऔΓग़ͤΔ
    ✓ ஋ͷܕ͸ϦΫΤετ͔Βਪ࿦͞ΕΔ

    View Slide

  21. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ unwrapͤͣʹ
    ஋ΛऔΓग़ͤΔ
    ✓ ஋ͷܕ͸ϦΫΤετ͔Βਪ࿦͞ΕΔ
    [Repository]

    View Slide

  22. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ unwrapͤͣʹ
    ஋ΛऔΓग़ͤΔ
    ✓ ஋ͷܕ͸ϦΫΤετ͔Βਪ࿦͞ΕΔ
    [Repository]
    ✓ ࣦഊ࣌͸NSError͕ೖΔ
    NSError

    View Slide

  23. let request = GitHub.Endpoint.SearchRepositories(query: "APIKit",
    sort: .Stars,
    order: .Ascending)
    GitHub.sendRequest(request) { response in
    switch response {
    case .Success(let box):
    self.repositories = box.unbox
    case .Failure(let box):
    println("error: \(box.unbox.localizedDescription)")
    }
    }
    ✓ unwrapͤͣʹ
    ஋ΛऔΓग़ͤΔ
    ✓ ஋ͷܕ͸ϦΫΤετ͔Βਪ࿦͞ΕΔ
    [Repository]
    ✓ ࣦഊ࣌͸NSError͕ೖΔ
    NSError
    LlamaKit.Result

    View Slide

  24. ҆શͰ࢖͍΍͍͢

    View Slide

  25. ϦΫΤετͷఆٛ

    View Slide

  26. public protocol Request {
    typealias Response: Any
    var URLRequest: NSURLRequest? { get }
    func responseFromObject(object: AnyObject) -> Response?
    }
    Requestϓϩτίϧʹ
    ద߹͢Ε͹׬ྃ

    View Slide

  27. public protocol Request {
    typealias Response: Any
    var URLRequest: NSURLRequest? { get }
    func responseFromObject(object: AnyObject) -> Response?
    }
    Requestϓϩτίϧʹ
    ద߹͢Ε͹׬ྃ
    ֤ΤϯυϙΠϯτͷఆٛ͸1ՕॴͰࡁΉ

    View Slide


  28. View Slide

  29. View Slide

  30. class SearchRepositories: APIKit.Request {
    enum Sort: String {
    case Stars = "stars"
    case Forks = "forks"
    case Updated = "updated"
    }
    enum Order: String {
    case Ascending = "asc"
    case Descending = "desc"
    }
    typealias Response = [Repository]
    let query: String
    let sort: Sort
    let order: Order
    var URLRequest: NSURLRequest? {
    return GitHub.URLRequest(.GET, "/search/repositories", [
    "q": query,
    "sort": sort.rawValue,
    "order": order.rawValue
    ])
    }
    init(query: String, sort: Sort = .Stars, order: Order = .Ascending) {
    self.query = query
    self.sort = sort
    self.order = order
    }
    }

    View Slide

  31. ·ΔͰ
    υΩϡϝϯτΛ
    ͔ࣸͨ͠ͷΑ͏ͳ
    ఆٛ

    View Slide

  32. ؾ͍͍࣋ͪ

    View Slide

  33. https://github.com/
    ishkawa/APIKit

    View Slide