[#] [Перевод] Эффективный JSON с функциональными концепциями и generics в Swift
habrabot(difrex,1) — All
2014-12-08 16:30:04


Это перевод статьи Tony DiPasquale [«Efficient JSON in Swift with Functional Concepts»][1].

### Предисловие переводчика.

Передо мной была поставлена задача: закачать данные в формате JSON с [Flickr.com][2] о 100 топ местах, в которых сделаны фотографии на данный момент, в массив моделей:

//------ Массив моделей Places
struct Places {
var places : [Place]
}

//-----Модель Place
struct Place {

let placeURL: NSURL
let timeZone: String
let photoCount : Int
let content : String

}


Кроме чисто прагматической задачи, мне хотелось посмотреть как в _Swift _работает «вывод типа из контекста» (type Inference), какие возможности _Swift_ в функциональном программировании, и я выбрала для парсинга JSON алгоритмы из статьи Tony DiPasquale [«Efficient JSON in Swift with Functional Concepts and Generics»][3], в которой он «протягивает» generic тип `Result` для обработки ошибок по всей цепочке преобразований: от запроса в сеть до размещения данных в массив Моделей для последующего представления в `UITableViewController`. Чтобы посмотреть как _Swift _работает «в связке» с _Objective-C_, для считывания данных с [Flickr.com][4] использовался Flickr API, представленный в курсе Стэнфордского Университета [«Stanford CS 193P iOS 7»][5], написанный на _Objective-C_. В результате помимо небольшого расширения Моделей:

extension Place: JSONDecodable {
static func create(placeURL: String)(timeZone: String)(photoCount: String)(content: String) -> Place {
return Place(placeURL: toURL(placeURL), timeZone: timeZone, photoCount: photoCount.toInt() ?? 0, content: content)
}
static func decode(json: JSON) -> Place? {
return _JSONParse(json) >>> { d in
Place.create
<^> d <| "place_url"
<*> d <| "timezone"
<*> d <| "photo_count"
<*> d <| "_content"
}
}
}

extension Places: JSONDecodable {
static func create(places: [Place]) -> Places {
return Places(places: places)
}
static func decode(json: JSON) -> Places? {
return _JSONParse(json) >>> { d in
Places.create
<^> d <| "places" <| "place"

}
}
}


мне самостоятельно пришлось написать только три строчки кода: [Читать дальше →][6]

[1]: http://robots.thoughtbot.com/efficient-json-in-swift-with-functional-concepts-and-generics
[2]: https://www.flickr.com/
[3]: http://robots.thoughtbot.com/efficient-json-in-swift-with-functional-concepts-and-generics
[4]: https://www.flickr.com/
[5]: http://web.stanford.edu/class/cs193p/cgi-bin/drupal/
[6]: http://habrahabr.ru/post/244821/#habracut