title: UITableView-Swift: Checkmark in UITableViewCell
body: <p>I'm using Xcode 6.0.1, iOS8 and Swift.
  I have to reproduce in my <code>UITableView</code> the same behavior of the <strong>Auto-Lock</strong> option in <strong>Settings->General</strong>. In Objective-C, in the past, I wrote</p>
  
  <pre><code>- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
      static NSString *CheckMarkCellIdentifier = @"CheckMarkCellIdentifier";
      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CheckMarkCellIdentifier];
      if (cell == nil) {
          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CheckMarkCellIdentifier] autorelease];
      }
      cell.textLabel.text = ...
      cell.detailTextLabel.text = ...;
      cell.accessoryType = [indexPath isEqual: self.lastSelectedIndexPath] ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;  
      return cell;
  
  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
      int newRow = indexPath.row;
      int oldRow  = self.lastSelectedIndexPath.row;
      if (newRow != oldRow) {
          UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
          newCell.accessoryType = UITableViewCellAccessoryCheckmark;
          UITableViewCell *oldCell = [tableView cellForRowAtIndexPath:self.lastSelectedIndexPath];
          oldCell.accessoryType = UITableViewCellAccessoryNone;
          self.lastSelectedIndexPath = indexPath;
      }
      [tableView deselectRowAtIndexPath:indexPath animated:YES];
  }
  </code></pre>
  
  <p>This works great!
  Now, in Swift, I wrote:</p>
  
  <pre><code>override func viewDidLoad() {
      super.viewDidLoad()
      ...
      self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "categoryCell")
  }
  
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -&gt; UITableViewCell {
      var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("categoryCell", forIndexPath: indexPath) as UITableViewCell
      cell.textLabel?.text = categories[indexPath.row]
      let row = indexPath.row;
      if let lastIndexPath = self.lastSelectedIndexPath {
          cell.accessoryType = (lastIndexPath.row == row) ? UITableViewCellAccessoryType.Checkmark : UITableViewCellAccessoryType.None;
      }
      return cell
  }
  
  func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
      self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
  
      let newRow = indexPath.row;
      var oldRow: Int?
      if let lastIndexPath = self.lastSelectedIndexPath {
          oldRow = lastIndexPath.row;
          let oldCell = self.tableView(tableView, cellForRowAtIndexPath: lastIndexPath)
          oldCell.accessoryType = UITableViewCellAccessoryType.None;
      }
      if (newRow != oldRow) {
          let newCell = self.tableView(tableView, cellForRowAtIndexPath: indexPath)
          newCell.accessoryType = UITableViewCellAccessoryType.Checkmark;
          self.lastSelectedIndexPath = indexPath;
      }
  }
  </code></pre>
  
  <p>And this doesn't work. The checkmark appears only sometimes and it disappears when I scroll. I spent two hours to figure out why but without success.</p>