2015-06-24 9 views
76

Sto cercando di eliminare una riga dalla mia origine dati e la seguente riga di codice:condizionale Binding: se l'errore lasciare - Initializer per legame condizionale deve avere tipo opzionale

if let tv = tableView { 

provoca il seguente errore:

Initializer for conditional binding must have Optional type, not UITableView

Ecco il codice 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) 

Come devo correggere la fol muggito?

if let tv = tableView { 
+4

poiché 'tableView' non è un valore facoltativo, non è necessario verificare se è nullo o meno. Quindi puoi usarlo direttamente, voglio dire rimuovere 'se lasciato' e usare solo 'tableView' nella funzione –

+0

Ciao, grazie Manny per la tua risposta. –

+0

Per i posteri, dopo aver risolto questo problema, mi sono imbattuto in 'variabile con getter/setter non può avere un valore iniziale', che è stato risolto rimuovendo semplicemente il blocco {} rimanente dopo l'inizializzazione, ala questa risposta: http: // stackoverflow .com/a/36002958/4544328 –

risposta

145

if let/if var opzionale legame funziona solo quando il risultato del lato destro dell'espressione è opzionale. Se il risultato della parte destra non è un optional, non è possibile utilizzare questa associazione facoltativa. Il punto di questo collegamento facoltativo è verificare nil e utilizzare la variabile solo se non è nil.

Nel tuo caso, il parametro tableView è dichiarato come tipo non opzionale UITableView. È garantito che non sia mai nil. Quindi l'associazione facoltativa qui non è necessaria.

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) 

Tutto ciò che dobbiamo fare è sbarazzarsi del if let e modificare le occorrenze di tv al suo interno ad appena tableView.

11

per il mio problema specifico ho dovuto sostituire

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

Con

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

La migliore risposta di questo ragazzo è vedere i commenti https://stackoverflow.com/a/31039427/2797944 –

7

Lo stesso vale per guardia dichiarazioni. Lo stesso messaggio di errore mi ha portato a questo post e ho risposto (grazie a @nhgrif).

Codice: stampa il cognome della persona solo se il secondo nome è composto da meno di quattro caratteri.

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)!") 

}

Fino a quando ho dichiarato ultima come un parametro opzionale che stavo vedendo lo stesso errore.

4

condizione vincolante deve avere tipo optinal che significa che è possibile associare solo i valori opzionali se lasciate dichiarazione

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? { 


     } 
    } 
} 

Questo funziona bene, ma assicurarsi che quando si utilizza se lasciare che esso deve avere tipo optinal "?"

2

Nel caso in cui si utilizza un tipo di cellula personalizzato, dire ArticleCell, si potrebbe ottenere un errore che dice:

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

Otterrete questo errore se la vostra riga di codice simile a questa:

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

è possibile correggere questo errore nel modo seguente:

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

Se controlli quanto sopra, vedrai che quest'ultimo usa il cast opzionale per una cella di tipo ArticleCell.

Problemi correlati