¿Cómo lanzar correctamente la subclass en Swift?

Tengo una UITableView con muchas celdas diferentes, en function de cuál es la matriz de contenido de la fuente de datos, deberían mostrar contenido personalizado.

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell : UITableViewCell? = nil let objectAtIndexPath: AnyObject = contentArray![indexPath.row] if let questionText = objectAtIndexPath as? String { cell = tableView.dequeueReusableCellWithIdentifier("questionCell", forIndexPath: indexPath) as QuestionTableViewCell cell.customLabel.text = "test" } return cell! } 

Aquí obtengo el error que

UITableViewCell does not have the attribute customLabel

que QuestionTableViewCell tiene. ¿Qué ocurre con mi conversión a QuestionTableViewCell ?

El problema no es su yeso sino su statement de cell . Lo declaraste como un UITableViewCell opcional y esa statement permanece para siempre, y es todo lo que el comstackdor sabe.

Por lo tanto, debe lanzar en el punto de la llamada a customLabel . En lugar de esto:

 cell.customLabel.text = "test" 

Necesitas esto:

 (cell as QuestionTableViewCell).customLabel.text = "test" 

Podría simplificarse esta tarea declarando una variable diferente (ya que sabe que, en este caso particular, su celda será un QuestionTableViewCell), pero siempre y cuando tenga una sola variable, tendrá que emitir constantemente a la class que creas que realmente será. Personalmente, habría escrito algo más parecido a esto, exactamente para evitar ese reparto repetido:

  if let questionText = objectAtIndexPath as? String { let qtv = tableView.dequeueReusableCellWithIdentifier("questionCell", forIndexPath: indexPath) as QuestionTableViewCell qtv.customLabel.text = "test" cell = qtv } 

El problema es esta var cell : UITableViewCell? = nil var cell : UITableViewCell? = nil ¿Lo declaras como UITableViewCell? y tiene ese tipo para siempre.

Puedes declarar otra variable

 let questionCell = cell as! QuestionTableViewCell questionCell.customLabel.text = "test" 

puede hacer cualquiera de los siguientes:

  1. replace: cell.customLabel.text = "test"

    con

     cell?.customLabel.text = "text1" 
  2. cambiar var cell : UITableView? = nil var cell : UITableView? = nil a var cell : UITableView!