title: How to unwrap my variables used in UILabels properly?
body: <p><strong>EDIT 1: Added my revision cellForRowAtIndexPath code at the bottom of the post</strong></p>
  
  <p><strong>EDIT 2: Added my new EditorialElement code</strong></p>
  
  <p>I am having difficulty properly unwrapping my UILabel text inputs properly, so all of my text says "Optional(Author name)" (for example, this is an app for a newspaper). I have tried to force unwrap my variables in different ways but was not able to make it work.</p>
  
  <p>The text input for my UILabels are created in the following way. The corresponding class is "EditorialElement", which has the following property definitions:</p>
  
  <pre><code>class EditorialElement: NSObject {
  
  var title: String!           // title
  var nodeID: Int?             // nid
  var timeStamp: Int       // revision_timestamp
  var imageURL: String?       // image_url
  var author: String?          // author
  
  var issueNumber: String!     // issue_int
  var volumeNumber: String!    // volume_int
  
  var articleContent: String! // html_content
  
  /* To get an NSDate objec from Unix timestamp
  var date = NSDate(timeIntervalSince1970: timeStamp) */
  
  init(title: String, nodeID: Int, timeStamp: Int, imageURL: String, author: String, issueNumber: String, volumeNumber: String, articleContent: String) {
      self.title = title
      self.nodeID = nodeID
      self.timeStamp = timeStamp
      self.imageURL = imageURL
      self.author = author
      self.issueNumber = issueNumber
      self.volumeNumber = volumeNumber
      self.articleContent = articleContent
  }
  
  override func isEqual(object: AnyObject!) -&gt; Bool {
      return (object as! EditorialElement).nodeID == self.nodeID
  }
  
  override var hash: Int {
      return (self as EditorialElement).nodeID!
  }
  
  }
  </code></pre>
  
  <p>Then, I use this class to retrieve data from my JSON file and parse it into an "editorialObjects" array (sorry about all the commenting and bad spacing):</p>
  
  <pre><code>func populateEditorials() {
      if populatingEditorials {
          return
      }
      populatingEditorials = true
  
      Alamofire.request(GWNetworking.Router.Editorials(self.currentPage)).responseJSON() { response in
          if let JSON = response.result.value {
             /*
          if response.result.error == nil {
              */
  
              /* Creating objects for every single editorial is long running work, so we put that work on a background queue, to keep the app very responsive. */
              dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) {
  
  
                  /* Making an array of all the node IDs from the JSON file */
                  var nodeIDArray : [Int]
  
  
                  if (JSON .isKindOfClass(NSDictionary)) {
  
                      for node in JSON as! Dictionary&lt;String, AnyObject&gt; {
  
                      let nodeIDValue = node.0
                      var lastItem : Int = 0
  
                      self.nodeIDArray.addObject(nodeIDValue)
  
                      if let editorialElement : EditorialElement = EditorialElement(title: "init", nodeID: 0, timeStamp: 0, imageURL: "init", author: "init", issueNumber: "init", volumeNumber: "init", articleContent: "init") {
  
                  editorialElement.title = node.1["title"] as! String
                  editorialElement.nodeID = Int(nodeIDValue)
  
                  let timeStampString = node.1["revision_timestamp"] as! String
                  editorialElement.timeStamp = Int(timeStampString)!
  
                  editorialElement.imageURL = String(node.1["image_url"])
                  editorialElement.author = String(node.1["author"])
                  editorialElement.issueNumber = String(node.1["issue_int"])
                  editorialElement.volumeNumber = String(node.1["volume_int"])
                  editorialElement.articleContent = String(node.1["html_content"])
  
                  lastItem = self.editorialObjects.count
  
                  print (editorialElement.nodeID)
  
  
                  self.editorialObjects.addObject(editorialElement)
  
  
                  /* Sorting the elements in order of newest to oldest (as the array index increases] */
                  let timestampSortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
                  self.editorialObjects.sortUsingDescriptors([timestampSortDescriptor])
  
                  let indexPaths = (lastItem..&lt;self.editorialObjects.count).map { NSIndexPath(forItem: $0, inSection: 0) }
  
  
                 /*
  
                          nodeIDArray[nodeCounter] = jsonValue{nodeCounter}.string
                          let editorialInfos : EditorialElement = ((jsonValue as! NSDictionary].1["\(nodeIDArray[nodeCounter]]"] as! [NSDictionary]].map { EditorialElement(title: $0["title"] as! String, nodeID: $0["nid"] as! Int, timeStamp: $0["revision_timestamp"] as! Int, imageURL: $0["image_url"] as! String, author: $0["author"], issueNumber: $0["issue_int"] as! Int, volumeNumber: $0["volume_int"] as! Int, articleContent: $0["html_content"] as! String] // I am going to try to break this line down to simplify it and fix the build errors
  */
  
  
  }
  
                  print(self.editorialObjects.count)
  
              }
          }
  
                  dispatch_async(dispatch_get_main_queue()) {
                      self.editorialsTableView.reloadData()
                  }
  
                  self.currentPage++
          }
      }
  
          self.populatingEditorials = false
  }
  }
  </code></pre>
  
  <p>And then I just use those objects for my labels in my cellForRowAtIndexPath method:</p>
  
  <pre><code>override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell {
  
      let row = indexPath.row
  
      let cell = tableView.dequeueReusableCellWithIdentifier(EditorialTableCellIdentifier, forIndexPath: indexPath) as! EditorialsTableViewCell
  
      let title = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).title
  
      let timeStamp = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).timeStamp
      let timeStampDateObject = NSDate(timeIntervalSince1970: NSTimeInterval(Int((editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).timeStamp)))
      timeStampDateString = dateFormatter.stringFromDate(timeStampDateObject)
  
      let imageURL = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).imageURL
  
      let author : String! = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).author!
  
      let issueNumber = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).issueNumber
      let volumeNumber = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).volumeNumber
  
      let articleContent = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).articleContent
  
      let nodeID = (editorialObjects.objectAtIndex(indexPath.row) as! EditorialElement).nodeID
  
      /* Unlike the Pictures Collection View, there is no need to create another Alamofire request here, since we already have all the content we want from the JSON we downloaded. There is no URL that we wish to place a request to to get extra content. */
  
      cell.editorialHeadlineLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
      cell.editorialHeadlineLabel.text = title
  
      cell.editorialAuthorLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
      cell.editorialAuthorLabel.text = author
  
      cell.editorialPublishDateLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
      cell.editorialPublishDateLabel.text = timeStampDateString
  
      return cell
  }
  </code></pre>
  
  <p>Where should I be force-unwrapping my variables ?</p>
  
  <p><strong>EDIT 1: Revised code</strong></p>
  
  <pre><code>override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell {
  
      let row = indexPath.row
  
      guard let cell = tableView.dequeueReusableCellWithIdentifier(EditorialTableCellIdentifier, forIndexPath: indexPath) as? EditorialsTableViewCell else {
          print ("error: editorialsTableView cell is not of class EditorialsTableViewCell, we will use RandomTableViewCell instead")
          return tableView.dequeueReusableCellWithIdentifier(EditorialTableCellIdentifier, forIndexPath: indexPath) as! RandomTableViewCell
      }
  
      if let editorialObject = editorialObjects.objectAtIndex(indexPath.row) as? EditorialElement {
          // we just unwrapped editorialObject
  
          let title = editorialObject.title ?? "" // if editorialObject.title == nil, then we return an empty string.
  
          let timeStampDateObject = NSDate(timeIntervalSince1970: NSTimeInterval(editorialObject.timeStamp))
          let timeStampDateString = dateFormatter.stringFromDate(timeStampDateObject)
  
          let author = editorialObject.author ?? ""
  
          let issueNumber = editorialObject.issueNumber ?? ""
          let volumeNumber = editorialObject.volumeNumber ?? ""
  
          let articleContent = editorialObject.articleContent ?? ""
  
          let nodeID = editorialObject.nodeID ?? 0
  
  
          cell.editorialHeadlineLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleHeadline)
          cell.editorialHeadlineLabel.text = title
  
          cell.editorialAuthorLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
          cell.editorialAuthorLabel.text = String(author)
  
          cell.editorialPublishDateLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline)
          cell.editorialPublishDateLabel.text = timeStampDateString
  
      } else {
  
      }
  
      return cell
  }
  </code></pre>
  
  <p><strong>EDIT 2: new EditorialElement code</strong></p>
  
  <pre><code>class EditorialElement: NSObject {
  
  var title: String           // title
  var nodeID: Int             // nid
  var timeStamp: Int       // revision_timestamp
  var imageURL: String       // image_url
  var author: String       // author
  
  var issueNumber: String     // issue_int
  var volumeNumber: String    // volume_int
  
  var articleContent: String // html_content
  
  /* To get an NSDate objec from Unix timestamp
  var date = NSDate(timeIntervalSince1970: timeStamp) */
  
  init(title: String, nodeID: Int, timeStamp: Int, imageURL: String, author: String, issueNumber: String, volumeNumber: String, articleContent: String) {
      self.title = title
      self.nodeID = nodeID
      self.timeStamp = timeStamp
      self.imageURL = imageURL
      self.author = author
      self.issueNumber = issueNumber
      self.volumeNumber = volumeNumber
      self.articleContent = articleContent
  }
  
  override func isEqual(object: AnyObject!) -&gt; Bool {
      return (object as! EditorialElement).nodeID == self.nodeID
  }
  
  override var hash: Int {
      return (self as EditorialElement).nodeID
  }
  
  }
  </code></pre>