Binding condizionale: if let error - L'inizializzatore per il binding condizionale deve avere il tipo Optional


120

Sto cercando di eliminare una riga dalla mia origine dati e la seguente riga di codice:

if let tv = tableView {

provoca il seguente errore:

L'inizializzatore per l'associazione condizionale deve avere il tipo facoltativo, non 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 quanto segue?

 if let tv = tableView {

8
poiché tableViewnon è un valore opzionale, non è necessario verificare se è nullo o meno. Quindi puoi usarlo direttamente, voglio dire rimuoverlo if let e usarlo tableViewnella funzione
Eric Qian,

Per i posteri, dopo aver risolto questo problema, mi sono imbattuto in variable with getter/setter cannot have an initial value, che è stato risolto semplicemente rimuovendo il blocco {} rimanente dopo l'inizializzazione, come questa risposta: stackoverflow.com/a/36002958/4544328
Jake T.

Risposte:


216

if let/ if varl'associazione facoltativa funziona solo quando il risultato del lato destro dell'espressione è facoltativo. Se il risultato del lato destro non è facoltativo, non è possibile utilizzare questa associazione facoltativa. Lo scopo di questa associazione facoltativa è controllare nile utilizzare la variabile solo se non è nil.

Nel tuo caso, il tableViewparametro è dichiarato come tipo non facoltativo UITableView. È garantito che non lo sarà 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 quello che dobbiamo fare è sbarazzarci di if lete modificare qualsiasi evento al tvsuo interno in giusto tableView.



16

Nel caso in cui utilizzi un tipo di cella personalizzato, ad esempio ArticleCell, potresti ricevere un errore che dice:

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

Riceverai questo errore se la tua riga di codice ha un aspetto simile a questo:

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

Puoi correggere questo errore effettuando le seguenti operazioni:

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

Se controlli quanto sopra, vedrai che quest'ultimo sta usando il casting opzionale per una cella di tipo ArticleCell.


Nel mio caso avevo bisogno di usareas! ArticleCell?
lilbiscuit

9

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

Il codice: stampa il cognome della persona solo se il secondo nome è inferiore a 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 non ho dichiarato last come parametro opzionale, vedevo lo stesso errore.


4

il binding della condizione deve avere un tipo optinal, il che significa che puoi associare solo valori facoltativi nell'istruzione if let

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


        }
    }
}

Funzionerà bene, ma assicurati che quando lo usi se lascia che deve avere il tipo optinal "?"


0

Bene, sarebbe comunque conveniente (sintatticamente) se potessimo dichiarare i valori usuali all'interno della condizione if. Quindi, ecco un trucco: puoi far pensare al compilatore che ci sia un'assegnazione di Optional.some(T)un valore in questo modo:

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.