{"id":1985,"date":"2015-12-28T16:31:19","date_gmt":"2015-12-28T22:31:19","guid":{"rendered":"http:\/\/jamesonquave.com\/blog\/?p=1985"},"modified":"2016-02-03T08:12:39","modified_gmt":"2016-02-03T14:12:39","slug":"being-swifty-with-collection-view-and-table-view-cells","status":"publish","type":"post","link":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/","title":{"rendered":"Being Swifty with Collection View and Table View Cells"},"content":{"rendered":"<p>Here&#8217;s a common scenario: You have a table view or collection view that has a variety of different types of content. You want to display varying cells based on these types of content, and they&#8217;re all mixed within a single section. Pardon the stand-in art, but it looks roughly like this:<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/jamesonquave.com\/images\/cells.png\" alt=\"\" \/><\/p>\n<p>In the Objective-C world, it was typical to just use an NSArray to hold whatever records your collection view was going to be using as a data source, and then for each element check what class it is before picking a cell. This case seems particularly not Swifty these days.<\/p>\n<div id=\"highlighter_610873\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"plain\">- (<\/code><code class=\"color2\">UICollectionViewCell<\/code> <code class=\"plain\">*)collectionView:(<\/code><code class=\"color1\">UICollectionView<\/code> <code class=\"plain\">*)collectionView cellForItemAtIndexPath:(<\/code><code class=\"color2\">NSIndexPath<\/code> <code class=\"plain\">*)indexPath {<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"color1\">UICollectionViewCell<\/code> <code class=\"plain\">*cell = [collectionView dequeueReusableCellWithReuseIdentifier:@<\/code><code class=\"string\">\"identifier\"<\/code> <code class=\"plain\">forIndexPath:indexPath];<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">id record = <\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.records[indexPath.row];<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">if<\/code><code class=\"plain\">([record isKindOfClass:[<\/code><code class=\"color2\">PlaythroughItem<\/code> <code class=\"keyword\">class<\/code><code class=\"plain\">]]) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"comments\">\/\/ ...<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">else<\/code> <code class=\"keyword\">if<\/code><code class=\"plain\">([record isKindOfClass:[<\/code><code class=\"color2\">ReviewItem<\/code> <code class=\"keyword\">class<\/code><code class=\"plain\">]]) {<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"comments\">\/\/ ...<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">else<\/code> <code class=\"keyword\">if<\/code><code class=\"plain\">([record isKindOfClass:[<\/code><code class=\"color2\">TrailerItem<\/code> <code class=\"keyword\">class<\/code><code class=\"plain\">]]) {<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"comments\">\/\/ ...<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"plain\">cell;<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><em>shudder<\/em><\/p>\n<p>Okay so that&#8217;s not the most type-safe approach, although it&#8217;s surprisingly common in Obj-C iOS code. As a better alternative in Swift, we can use enum cases for the different item types, and perform lookups of the items themeselves as needed. Let&#8217;s look at an example.<\/p>\n<h3 id=\"example\">Example<\/h3>\n<p>In an entertainment app I&#8217;m working on I&#8217;ve got a few types of cells for the types of news items that come in:<\/p>\n<div id=\"highlighter_618601\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"keyword\">enum<\/code> <code class=\"color2\">NewsItem<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Trailer<\/code><code class=\"plain\">(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Review<\/code><code class=\"plain\">(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Playthrough<\/code><code class=\"plain\">(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>The index is just a way to keep track of <em>which<\/em> item this it supposed to represent in the database. We take this approach to keep the amount of data needed to produce the collection view down. We don&#8217;t need all the associated data with every video to be present when putting together a collection view, we just need the info on what cell is tapped, after it is tapped.<\/p>\n<p>Let&#8217;s say we have a simple collection view that shows one of these three and picks a custom cell for each. In a Swift file <strong>NewsFeed.swift<\/strong> I have that acts as the dataSource of my collection view for the main news view. Of particular interest is the cellForItemAtIndexPath method, which runs the NewsItem record through a switch and produces the correct type of cell, with the relevant information populated:<\/p>\n<div id=\"highlighter_689308\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"keyword\">func<\/code> <code class=\"plain\">collectionView(collectionView: <\/code><code class=\"color1\">UICollectionView<\/code><code class=\"plain\">, cellForItemAtIndexPath indexPath: <\/code><code class=\"color1\">NSIndexPath<\/code><code class=\"plain\">) -&gt; <\/code><code class=\"color1\">UICollectionViewCell<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">record = records[indexPath.row]<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">switch<\/code><code class=\"plain\">(record) {<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"plain\">.<\/code><code class=\"color2\">Playthrough<\/code><code class=\"plain\">(<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">index):<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">cell = collectionView.dequeueReusableCellWithReuseIdentifier(<\/code><code class=\"string\">\"PlaythroughCell\"<\/code><code class=\"plain\">, forIndexPath: indexPath) <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">PlaythroughCollectionViewCell<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">playthrough = <\/code><code class=\"color2\">MediaDB<\/code><code class=\"plain\">.playthroughAtIndex(index)<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.titleLabel.text = playthrough.title<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.lengthLabel.text = playthrough.length.prettyTime<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"plain\">cell<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"plain\">.<\/code><code class=\"color2\">Review<\/code><code class=\"plain\">(<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">index):<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">cell = collectionView.dequeueReusableCellWithReuseIdentifier(<\/code><code class=\"string\">\"ReviewCell\"<\/code><code class=\"plain\">, forIndexPath: indexPath) <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">ReviewCollectionViewCell<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">review = <\/code><code class=\"color2\">MediaDB<\/code><code class=\"plain\">.reviewAtIndex(index)<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.ratingLabel.text = <\/code><code class=\"string\">\"\\(review.rating) out of 10\"<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.titleLabel.text = review.title<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"plain\">cell<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"plain\">.<\/code><code class=\"color2\">Trailer<\/code><code class=\"plain\">(<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">index):<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">cell = collectionView.dequeueReusableCellWithReuseIdentifier(<\/code><code class=\"string\">\"TrailerCell\"<\/code><code class=\"plain\">, forIndexPath: indexPath) <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">TrailerCollectionViewCell<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">trailer = <\/code><code class=\"color2\">MediaDB<\/code><code class=\"plain\">.trailerAtIndex(index)<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.titleLabel.text = trailer.title<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.lengthLabel.text = trailer.length.prettyTime<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"plain\">cell<\/code><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>This code works well enough, record is of type <code>NewsItem<\/code> which can be one of three cases for the different news items we support:<\/p>\n<div id=\"highlighter_761189\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"keyword\">enum<\/code> <code class=\"color2\">NewsItem<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Trailer<\/code><code class=\"plain\">(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Review<\/code><code class=\"plain\">(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Playthrough<\/code><code class=\"plain\">(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>The associated index value is so that we can find the individual item in the DB when the collection view wants to display a cell.<\/p>\n<p>Something about this code didn&#8217;t sit right with me though. I felt that too much of the code was boilerplate; in particular the switch felt bulky and like it had too much <em>work<\/em> being done inside each case.<\/p>\n<p>But what if I created a protocol for any data source that could be presented as a collection view cell? It would change on a view-by-view basis so I don&#8217;t actually want this in my model.. but I do like having it on these particular CollectionViewCell subclasses.<\/p>\n<p>So, I created a protocol called NewsCellPresentable, which I can adhere to in extensions with my custom collection view cells:<\/p>\n<div id=\"highlighter_320069\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"keyword\">protocol<\/code> <code class=\"color2\">NewsCellPresentable<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">func<\/code> <code class=\"plain\">configureForIndex(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"plain\">extension <\/code><code class=\"color2\">PlaythroughCollectionViewCell<\/code><code class=\"plain\">: <\/code><code class=\"color2\">NewsCellPresentable<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">func<\/code> <code class=\"plain\">configureForIndex(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">playthrough = <\/code><code class=\"color2\">MediaDB<\/code><code class=\"plain\">.playthroughAtIndex(index)<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.titleLabel.text = playthrough.title<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.lengthLabel.text = playthrough.length.prettyTime<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"plain\">extension <\/code><code class=\"color2\">ReviewCollectionViewCell<\/code><code class=\"plain\">: <\/code><code class=\"color2\">NewsCellPresentable<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">func<\/code> <code class=\"plain\">configureForIndex(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">) {<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">review = <\/code><code class=\"color2\">MediaDB<\/code><code class=\"plain\">.reviewAtIndex(index)<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.titleLabel.text = review.title<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.ratingLabel.text = <\/code><code class=\"string\">\"\\(review.rating) out of 10\"<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"plain\">extension <\/code><code class=\"color2\">TrailerCollectionViewCell<\/code><code class=\"plain\">: <\/code><code class=\"color2\">NewsCellPresentable<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">func<\/code> <code class=\"plain\">configureForIndex(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">) {<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">trailer = <\/code><code class=\"color2\">MediaDB<\/code><code class=\"plain\">.trailerAtIndex(index)<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.titleLabel.text = trailer.title<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">self<\/code><code class=\"plain\">.lengthLabel.text = trailer.length.prettyTime<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>This feels much cleaner already. Now I can go back to my cellForItemAtIndexPath method and trim it down to just the following:<\/p>\n<div id=\"highlighter_821377\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"keyword\">func<\/code> <code class=\"plain\">collectionView(collectionView: <\/code><code class=\"color1\">UICollectionView<\/code><code class=\"plain\">, cellForItemAtIndexPath indexPath: <\/code><code class=\"color2\">NSIndexPath<\/code><code class=\"plain\">) -&gt; <\/code><code class=\"color2\">UICollectionViewCell<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">record = records[indexPath.row]<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">var<\/code> <code class=\"plain\">cell: <\/code><code class=\"color2\">NewsCellPresentable<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">switch<\/code><code class=\"plain\">(record) {<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"plain\">.<\/code><code class=\"color2\">Playthrough<\/code><code class=\"plain\">(<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">index):<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell = collectionView.dequeueReusableCellWithReuseIdentifier(<\/code><code class=\"string\">\"PlaythroughCell\"<\/code><code class=\"plain\">, forIndexPath: indexPath) <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">PlaythroughCollectionViewCell<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.configureForIndex(index)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"plain\">.<\/code><code class=\"color2\">Review<\/code><code class=\"plain\">(<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">index):<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell = collectionView.dequeueReusableCellWithReuseIdentifier(<\/code><code class=\"string\">\"ReviewCell\"<\/code><code class=\"plain\">, forIndexPath: indexPath) <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">ReviewCollectionViewCell<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.configureForIndex(index)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"plain\">.<\/code><code class=\"color2\">Trailer<\/code><code class=\"plain\">(<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">index):<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell = collectionView.dequeueReusableCellWithReuseIdentifier(<\/code><code class=\"string\">\"TrailerCell\"<\/code><code class=\"plain\">, forIndexPath: indexPath) <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">TrailerCollectionViewCell<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">cell.configureForIndex(index)<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"plain\">(cell <\/code><code class=\"keyword\">as<\/code><code class=\"plain\">! <\/code><code class=\"color2\">MediaCollectionViewCell<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>What do you think? Is this a cleaner approach? Let me know if you have a different method in the comment, or <a href=\"http:\/\/twitter.com\/jquave\">let me know on Twitter<\/a>. My username is <a href=\"http:\/\/twitter.com\/jquave\">@jquave<\/a>.<\/p>\n<h3 id=\"p-s-\">P.S.<\/h3>\n<p>If you want to try this out yourself and don&#8217;t have the same DB layer as me&#8230; guess what? Neither do I! You can easily stub this out like this:<\/p>\n<div id=\"highlighter_898394\" class=\"syntaxhighlighter nogutter highlightedCode \">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"keyword\">class<\/code> <code class=\"color2\">MediaDB<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">class<\/code> <code class=\"keyword\">func<\/code> <code class=\"plain\">titleForRecord(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">) -&gt; <\/code><code class=\"color2\">String<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"string\">\"Title!!\"<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">class<\/code> <code class=\"keyword\">func<\/code> <code class=\"plain\">trailerAtIndex(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">) -&gt; <\/code><code class=\"color2\">Trailer<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"color2\">Trailer<\/code><code class=\"plain\">()<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">class<\/code> <code class=\"keyword\">func<\/code> <code class=\"plain\">reviewAtIndex(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">) -&gt; <\/code><code class=\"color2\">Review<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"color2\">Review<\/code><code class=\"plain\">()<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">class<\/code> <code class=\"keyword\">func<\/code> <code class=\"plain\">playthroughAtIndex(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">) -&gt; <\/code><code class=\"color2\">Playthrough<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">return<\/code> <code class=\"color2\">Playthrough<\/code><code class=\"plain\">()<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"keyword\">struct<\/code> <code class=\"color2\">Trailer<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">title = <\/code><code class=\"string\">\"Trailer Title\"<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">length = 190<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><\/div>\n<div class=\"line number21 index20 alt2\"><code class=\"keyword\">struct<\/code> <code class=\"color2\">Review<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">title = <\/code><code class=\"string\">\"Review Title\"<\/code><\/div>\n<div class=\"line number23 index22 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">rating = 4<\/code><\/div>\n<div class=\"line number24 index23 alt1\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number25 index24 alt2\"><\/div>\n<div class=\"line number26 index25 alt1\"><code class=\"keyword\">struct<\/code> <code class=\"color2\">Playthrough<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number27 index26 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">title = <\/code><code class=\"string\">\"Playthrough Title\"<\/code><\/div>\n<div class=\"line number28 index27 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">let<\/code> <code class=\"plain\">length = 9365<\/code><\/div>\n<div class=\"line number29 index28 alt2\"><code class=\"plain\">}<\/code><\/div>\n<div class=\"line number30 index29 alt1\"><\/div>\n<div class=\"line number31 index30 alt2\"><\/div>\n<div class=\"line number32 index31 alt1\"><code class=\"keyword\">enum<\/code> <code class=\"color2\">NewsItem<\/code> <code class=\"plain\">{<\/code><\/div>\n<div class=\"line number33 index32 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Trailer<\/code><code class=\"plain\">(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number34 index33 alt1\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Review<\/code><code class=\"plain\">(index: <\/code><code class=\"color1\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number35 index34 alt2\"><code class=\"undefined spaces\">\u00a0\u00a0\u00a0\u00a0<\/code><code class=\"keyword\">case<\/code> <code class=\"color2\">Playthrough<\/code><code class=\"plain\">(index: <\/code><code class=\"color2\">Int<\/code><code class=\"plain\">)<\/code><\/div>\n<div class=\"line number36 index35 alt1\"><code class=\"plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Personally I always stub things out with static values before I do the work of integrating with a backend service or whatever data provider is needed. This makes it much easier to iterate.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here&#8217;s a common scenario: You have a table view or collection view that has a variety of different types of content. You want to display varying cells based on these types of content, and they&#8217;re all mixed within a single section. Pardon the stand-in art, but it looks roughly like this: In the Objective-C world,&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_links_to":"","_links_to_target":""},"categories":[25,24,10,71],"tags":[15,33],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Being Swifty with Collection View and Table View Cells - Jameson Quave<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Being Swifty with Collection View and Table View Cells - Jameson Quave\" \/>\n<meta property=\"og:description\" content=\"Here&#8217;s a common scenario: You have a table view or collection view that has a variety of different types of content. You want to display varying cells based on these types of content, and they&#8217;re all mixed within a single section. Pardon the stand-in art, but it looks roughly like this: In the Objective-C world,...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/\" \/>\n<meta property=\"og:site_name\" content=\"Jameson Quave\" \/>\n<meta property=\"article:published_time\" content=\"2015-12-28T22:31:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-02-03T14:12:39+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/jamesonquave.com\/images\/cells.png\" \/>\n<meta name=\"author\" content=\"Jameson Quave\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jameson Quave\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/\",\"url\":\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/\",\"name\":\"Being Swifty with Collection View and Table View Cells - Jameson Quave\",\"isPartOf\":{\"@id\":\"https:\/\/jamesonquave.com\/blog\/#website\"},\"datePublished\":\"2015-12-28T22:31:19+00:00\",\"dateModified\":\"2016-02-03T14:12:39+00:00\",\"author\":{\"@id\":\"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc\"},\"breadcrumb\":{\"@id\":\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jamesonquave.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Being Swifty with Collection View and Table View Cells\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/#website\",\"url\":\"https:\/\/jamesonquave.com\/blog\/\",\"name\":\"Jameson Quave\",\"description\":\"Using computer technology to educate, and improve lives.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jamesonquave.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc\",\"name\":\"Jameson Quave\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg\",\"caption\":\"Jameson Quave\"},\"sameAs\":[\"http:\/\/jamesonquave.com\"],\"url\":\"https:\/\/jamesonquave.com\/blog\/author\/jquave\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Being Swifty with Collection View and Table View Cells - Jameson Quave","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/","og_locale":"en_US","og_type":"article","og_title":"Being Swifty with Collection View and Table View Cells - Jameson Quave","og_description":"Here&#8217;s a common scenario: You have a table view or collection view that has a variety of different types of content. You want to display varying cells based on these types of content, and they&#8217;re all mixed within a single section. Pardon the stand-in art, but it looks roughly like this: In the Objective-C world,...","og_url":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/","og_site_name":"Jameson Quave","article_published_time":"2015-12-28T22:31:19+00:00","article_modified_time":"2016-02-03T14:12:39+00:00","og_image":[{"url":"http:\/\/jamesonquave.com\/images\/cells.png"}],"author":"Jameson Quave","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Jameson Quave","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/","url":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/","name":"Being Swifty with Collection View and Table View Cells - Jameson Quave","isPartOf":{"@id":"https:\/\/jamesonquave.com\/blog\/#website"},"datePublished":"2015-12-28T22:31:19+00:00","dateModified":"2016-02-03T14:12:39+00:00","author":{"@id":"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc"},"breadcrumb":{"@id":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/jamesonquave.com\/blog\/being-swifty-with-collection-view-and-table-view-cells\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jamesonquave.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Being Swifty with Collection View and Table View Cells"}]},{"@type":"WebSite","@id":"https:\/\/jamesonquave.com\/blog\/#website","url":"https:\/\/jamesonquave.com\/blog\/","name":"Jameson Quave","description":"Using computer technology to educate, and improve lives.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jamesonquave.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/db6184f355c7f4e3b876d0f228c2fcfc","name":"Jameson Quave","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jamesonquave.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d9786c83345117d560bbeab0e1f26814?s=96&d=retro&r=pg","caption":"Jameson Quave"},"sameAs":["http:\/\/jamesonquave.com"],"url":"https:\/\/jamesonquave.com\/blog\/author\/jquave\/"}]}},"_links":{"self":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts\/1985"}],"collection":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/comments?post=1985"}],"version-history":[{"count":8,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts\/1985\/revisions"}],"predecessor-version":[{"id":2014,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/posts\/1985\/revisions\/2014"}],"wp:attachment":[{"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/media?parent=1985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/categories?post=1985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jamesonquave.com\/blog\/wp-json\/wp\/v2\/tags?post=1985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}