Skip to content

Instantly share code, notes, and snippets.

@pwightman
Last active August 29, 2015 14:10
Show Gist options
  • Save pwightman/a3a1f059f8cdaf831cf4 to your computer and use it in GitHub Desktop.
Save pwightman/a3a1f059f8cdaf831cf4 to your computer and use it in GitHub Desktop.
Basic Hypermedia API implementation in Swift
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