The Flickr API has been a go-to resource for iOS programming tutorials pretty much from the beginning. Well, here it is in Swift. A couple months ago I was asked to do a coding challenge for a job interview. The instructions didn't specify a programming language, only to write an iOS app that searches the Flickr API for images and displays them (those weren't the exact instructions, but more or less cover it). I did it in Swift, and although it took me longer than it should've, I learned a few things about programming in Swift.
Swift lessons learned:
- Data provider pattern
- Asynchronous callbacks
- Using structs to declare static variables
- Simple JSON parsing
Data Providers
Rather than putting the networking code in the view controller, it is separated into a data provider class. This class uses a callback to send the appropriate data back to the view controller for display. This pattern is used in Objective-C as well, and is a great way to keep code organized and avoid massive view controllers.
Asynchronous Callbacks
Due to the asynchronous nature of API calls, it's useful to return a callback from the data provider once the server response has been returned. This is done by defining a callback block in the FlickrProvider class.
typealias FlickrResponse = (NSArray?, NSError?) -> Void
The callback will be passed into the function to fetch photos.
class func fetchPhotosForSearchText(searchText: String, onCompletion: FlickrResponse) -> Void { // Hit API, parse JSON response, return an array of photos onCompletion(photosArray, nil) }
Use in your view controller as follows.
FlickrProvider.fetchPhotosForSearchText(searchText, onCompletion: { (photos: NSArray?, error: NSError?) -> Void in if error == nil { // Fetched some photos! } })
Static Variables
Run into class variables not supported yet? Use a struct instead. Where you would have used a const or a #define before, you can declare struct with a static constant. This can also help you keep API credentials, notification names, NSUserDefaults keys, etc. organized.
struct Keys { static let flickrKey = "z0461br2b85aee5" }
jSON Parsing
There are a few libraries that have been written to help you parse JSON in Swift, but in this case we'll just keep it simple and us NSJSONSerialization. This will convert JSON into a dictionary.
var jsonError: NSError? var resultsDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: &jsonError) as? NSDictionary if jsonError != nil { println("Error parsing JSON: \(jsonError!)") } println("results: \(resultsDictionary)")
finished Product
The end result is a simple app that allows you to search the Flickr API to your heart's content. View SwiftFlickrSearch on GitHub. The code doesn't have many comments because by nature Swift is fairly self-documenting. Welcoming any changes or improvements though.