title: Populating a UITable with NSDictionary in SWIFT
body: <p>I have a dictionary that I retrieve from a JSON request and I would like to populate a table with those values. I think everything is okay, however I am getting an error in the class declaration that <code>Type SubjectsViewController does not conform to protocol 'UITableViewDataSource'</code> I am using a storyboard, and I added the table view on the UI to <code>datasource</code> and <code>delegate</code> and as far as I know, I am implementing the functions correctly. I have added the relevant parts of my code below.</p>
  
  <p>It may be useful to see <a href="https://stackoverflow.com/questions/42430429/populate-uitable-with-a-json-result">this</a> which is a question I posted to understand why I am using the callback. Thanks in advance!</p>
  
  <pre><code>class SubjectsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
  
    override func viewDidLoad() {
          super.viewDidLoad()
  
          getSubjects(callback: {(resultValue)-&gt; Void in
  
              func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
                  return resultValue.count
              }
  
              func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell {
                  let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
                  cell.textLabel?.text = resultValue[indexPath.row] as! String?
                  return cell
              }
  
          })
      }
  
      // Initialise components of the view
      let UserDetails = UserDefaults.standard.stringArray(forKey: "UserDetailsArray") ?? [String]()
      @IBOutlet weak var tableView: UITableView!
  
      // Function to retrieve the subjects for the user
      func getSubjects(callback: @escaping (NSDictionary)-&gt; Void){
  
          let myUrl = NSURL(string: "www.mydomain.com/retrieveSubjects.php");
          let request = NSMutableURLRequest(url:myUrl as! URL)
          let user_id = UserDetails[0]
          request.httpMethod = "POST";
          let postString = "user_id=\(user_id)";
          request.httpBody = postString.data(using: String.Encoding.utf8);
  
          let task = URLSession.shared.dataTask(with: request as URLRequest){
              data, response, error in
  
              if error != nil {
                  print("error=\(error)")
                  return
              }
  
              var err: NSError?
              do {
                  let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
                  if let parseJSON = json {
                      let resultValue: NSDictionary = parseJSON["subjects"] as! NSDictionary
                      callback(resultValue)
                  }
              } catch let error as NSError {
                  err = error
                  print(err!);
              }
          }
          task.resume();
      }
  }
  </code></pre>
  
  <p><strong>EDIT</strong>: CLASS throwing unexpectedly found nil while unwrapping an optional value</p>
  
  <pre><code>class SubjectsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
  
  var dataDict: [String:AnyObject]?
  @IBOutlet var tableView: UITableView!
  let userDetails: [String] = UserDefaults.standard.stringArray(forKey:"UserDetailsArray")!
  
  override func viewDidLoad() {
      super.viewDidLoad()
      self.dataDict = [String:AnyObject]()
      self.tableView.delegate = self
      self.tableView.dataSource = self
      self.getSubjects()
  }
  
  func numberOfSections(in tableView: UITableView) -&gt; Int {
      return 1
  }
  
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -&gt; Int {
      return self.dataDict!.count
  }
  
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -&gt; UITableViewCell {
      let cell = UITableViewCell(style: UITableViewCellStyle.value1, reuseIdentifier: "cell")
      let array = self.dataDict?[String(indexPath.row)] as! [String]
  
      print(array)
  
      cell.textLabel?.text = array[0]
      cell.detailTextLabel?.text = array[1]
      return cell
  }
  
  func getSubjects() {
  
      let myUrl = NSURL(string: "www.mydomain/retrieveSubjects.php");
      let request = NSMutableURLRequest(url:myUrl as! URL)
      let user_id = userDetails[0]
      request.httpMethod = "POST";
      let postString = "user_id=\(user_id)";
      request.httpBody = postString.data(using: String.Encoding.utf8);
  
      let task = URLSession.shared.dataTask(with: request as URLRequest) {
          data, response, error in
  
          if error != nil {
              print("error=\(error)")
              return
          }
  
          var err: NSError?
          do {
              let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
              if let parseJSON = json {
                  let resultValue = parseJSON["subjects"] as! [String:AnyObject]
                  self.dataDict = resultValue
                  self.tableView.reloadData()
              }
          } catch let error as NSError {
              err = error
              print(err!);
          }
      }
      task.resume();
  }
  }
  </code></pre>