Enlace condicional: si deja error: el inicializador para el enlace condicional debe tener un tipo opcional

Estoy intentando eliminar una fila de mi fuente de datos y la siguiente línea de código:

if let tv = tableView { 

causa el siguiente error:

El inicializador para el enlace condicional debe tener el tipo opcional, no UITableView

Aquí está el código completo:

 // Override to support editing the table view. func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { // Delete the row from the data source if let tv = tableView { myData.removeAtIndex(indexPath.row) tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

¿Cómo debo corregir lo siguiente?

  if let tv = tableView { 

if let / if var binding opcional solo funciona cuando el resultado del lado derecho de la expresión es opcional. Si el resultado del lado derecho no es opcional, no puede usar este enlace opcional. El objective de este enlace opcional es comprobar si es nil y solo utilizar la variable si no es nil .

En su caso, el parámetro tableView se declara como el tipo no opcional UITableView . Está garantizado que nunca será nil . Entonces el enlace opcional aquí es innecesario.

 func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { // Delete the row from the data source myData.removeAtIndex(indexPath.row) tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 

Todo lo que tenemos que hacer es deshacernos de if let y cambiar cualquier ocurrencia de tv dentro de tableView .

para mi problema específico tuve que reemplazar

 if let count = 1 { // do something ... } 

Con

 let count = 1 if(count > 0) { // do something ... } 

Lo mismo aplica para las declaraciones de guardia . El mismo mensaje de error me llevó a esta publicación y respuesta (gracias @nhgrif).

El código: Imprime el apellido de la persona solo si el segundo nombre tiene menos de cuatro caracteres.

 func greetByMiddleName(name: (first: String, middle: String?, last: String?)) { guard let Name = name.last where name.middle?.characters.count < 4 else { print("Hi there)") return } print("Hey \(Name)!") 

}

Hasta que declare el último como un parámetro opcional, estaba viendo el mismo error.

En un caso en el que usa un tipo de celda personalizado, diga ArticleCell, es posible que obtenga un error que diga:

  Initializer for conditional binding must have Optional type, not 'ArticleCell' 

Obtendrá este error si su línea de código se ve así:

  if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

Puede corregir este error haciendo lo siguiente:

  if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell? 

Si comprueba lo anterior, verá que este último está utilizando el moldeado opcional para una celda del tipo ArticleCell.

El enlace de condición debe tener un tipo optinal, lo que significa que solo puede enlazar valores opcionales en el enunciado si

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { // Delete the row from the data source if let tv = tableView as UITableView? { } } } 

Esto funcionará bien, pero asegúrese de usar si deja que debe tener el tipo optinal “?”