Last active
August 29, 2015 14:10
-
-
Save pwightman/a3a1f059f8cdaf831cf4 to your computer and use it in GitHub Desktop.
Basic Hypermedia API implementation in Swift
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
let userJSON = [ | |
"url": "https://example.com/users/123", | |
"name": "Jim", | |
"profile_url": "https://example.com/users/123/profile", | |
"posts_url": "https://example.com/users/123/posts" | |
] | |
// API resources, such as User, Profile, Post, etc. | |
protocol Resource { | |
var URI: NSURL { get } | |
init(JSON: [String:AnyObject]) | |
} | |
// For representing "links" to other resources | |
struct Reference<T : Resource> { | |
let resourceURI: NSURL | |
} | |
struct CollectionReference<T : Resource> { | |
let resourceURI: NSURL | |
} | |
// Implemented resources | |
class User : Resource { | |
let URI: NSURL | |
let name: String | |
let profile: Reference<Profile> | |
let posts: CollectionReference<Post> | |
required init(JSON: [String:AnyObject]) { | |
self.URI = NSURL(string: JSON["url"]! as String)! | |
self.name = JSON["name"]! as String | |
self.profile = Reference(resourceURI: NSURL(string: JSON["profile_url"]! as String)!) | |
self.posts = CollectionReference(resourceURI: NSURL(string: JSON["posts_url"]! as String)!) | |
} | |
} | |
class Profile : Resource { | |
let URI: NSURL | |
required init(JSON: [String:AnyObject]) { | |
self.URI = NSURL(string: JSON["url"]! as String)! | |
} | |
} | |
class Post : Resource { | |
let URI: NSURL | |
required init(JSON: [String:AnyObject]) { | |
self.URI = NSURL(string: JSON["url"]! as String)! | |
} | |
} | |
// Stubbed out client that makes requests against Resources and References | |
class Client { | |
func get<R : Resource>(reference: Reference<R>, completion: (R) -> Void) { | |
// Fetch thing | |
// R(JSON: resultJSON) | |
} | |
func getCollection<R : Resource>(reference: CollectionReference<R>, completion: ([R]) -> Void) { | |
// Fetch thing | |
// R(JSON: resultJSON) | |
} | |
func put<R : Resource>(resource: R, completion: (R) -> Void) { | |
// Update resource on server | |
} | |
func post<R : Resource>(resource: R, completion: (R) -> Void) { | |
// Create resource on server | |
} | |
} | |
// Usage | |
let client = Client() | |
let reference = Reference<User>(resourceURI: NSURL(string: userJSON["url"]! as String)!) | |
client.get(reference) { (user: User) -> Void in | |
client.getCollection(user.posts) { posts in | |
} | |
client.get(user.profile) { profile in | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment