Falta el retorno UITableViewCell

Estoy seguro de que esta pregunta se ha preguntado antes, pero no puedo encontrar una respuesta que resuelva mi problema con if-else anidada y lógica de conmutación de mayúsculas y minúsculas.
Tengo una UITableView con dos secciones, cada sección tiene dos celdas personalizadas. Eso es todo 4 celdas Pero no importa lo que hago obtengo "Falta el retorno en una function que se espera que devuelva UITableViewCell "

Pregunta ¿Cómo puedo cambiar esta configuration para que obtenga una instrucción else en la parte inferior que satisfaga la lógica rápida?

Cualquier ayuda sería muy apreciada

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if indexPath.section == 0{ switch (indexPath.row) { case 0: let cell0: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell cell0.backgroundColor = UIColor.networkingColor() break case 1: let cell1: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell cell1.backgroundColor = UIColor.whiteColor() break default: break } } if indexPath.section == 1{ switch (indexPath.row) { case 0: let cell10: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell cell10.backgroundColor = UIColor.networkingColor() break case 1: let cell11: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell cell11.backgroundColor = UIColor.whiteColor() break default: break } } } 

  • Declare la celda al comienzo del método,
  • asigne un valor a la celda según la sección y el número de fila,
  • lanzar un fatalError() en todos los casos que "no deberían ocurrir",
  • devuelve la celda

También tenga en count que las instrucciones de break no son necesarias. El comportamiento pnetworkingeterminado en Swift no es pasar al siguiente caso.

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell: SettingsCell switch(indexPath.section) { case 0: switch (indexPath.row) { case 0: cell = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() case 1: cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() default: fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)") } case 1: switch (indexPath.row) { case 0: cell = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() case 1: cell = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() default: fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)") } default: fatalError("Unexpected section \(indexPath.section)") } return cell } 

La function de error fatalError() está marcada como @noreturn , por lo que el comstackdor sabe que la ejecución del progtwig no continuará desde los casos pnetworkingeterminados. (Esto también ayuda a encontrar errores de lógica en el progtwig).

El comstackdor verifica que se asigna un valor a la cell en todos los demás casos.

La posibilidad de inicializar una constante ( let cell ... ) de esta manera es nueva en Swift 1.2.


Alternativamente, puede crear una celda y devolverla "inmediatamente" en cada caso:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { switch(indexPath.section) { case 0: switch (indexPath.row) { case 0: let cell = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() return cell case 1: let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() return cell default: fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)") } case 1: switch (indexPath.row) { case 0: let cell = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() return cell case 1: let cell = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() return cell default: fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)") } default: fatalError("Unexpected section \(indexPath.section)") } } 

Nuevamente, llamar a fatalError() resuelve el error del comstackdor "falta de retorno esperado".

Este patrón puede ser útil si hay diferentes types de celdas (con diferentes classs) creadas en cada caso.

Debe devolver una celda, si la sección es el número 2, estos methods no devolverán nada, así es el caso cuando se especifican más de dos. Solución

  • Segundo "si" será "otra parte"
  • Limitar el número de la sección

Te falta el método de la statement de devolución .

Ejemplo con statement de retorno.

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if indexPath.section == 0{ switch (indexPath.row) { case 0: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() break case 1: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() break default: let cellId: NSString = "Cell" var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell break } } if indexPath.section == 1{ switch (indexPath.row) { case 0: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() break case 1: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() break default: let cellId: NSString = "Cell" var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell break } } return cell } 

puedes usar otro si así:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { if indexPath.section == 0{ switch (indexPath.row) { case 0: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() break case 1: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() break default: break } else if indexPath.section == 1{ switch (indexPath.row) { case 0: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.networkingColor() break case 1: let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell cell.backgroundColor = UIColor.whiteColor() break default: break } } return cell } } 

puede ayudarlo a intentarlo