2015-06-24 8 views
76

próbuję usunąć wiersz z mojego źródła danych i następujący wiersz kodu:Warunkowe Oprawa: czy pozwolić błąd - Initializer dla warunkowego wiązania musi mieć typ opcjonalny

if let tv = tableView { 

powoduje następujący błąd:

Initializer for conditional binding must have Optional type, not UITableView

Oto pełny kod:

// 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) 

jaki sposób należy skorygować fol lowing?

if let tv = tableView { 
+4

ponieważ 'tableView' nie jest wartością opcjonalną, nie ma potrzeby sprawdzania, czy jest zerowa czy nie. Więc możesz go bezpośrednio użyć, mam na myśli usunięcie, że 'if let' i po prostu użyj' tableView' w funkcji –

+0

Cześć, Manny dzięki za twoją odpowiedź. –

+0

Dla potomności, po rozwiązaniu tego problemu, natknąłem się na 'zmienna z programem getter/setter, która nie może mieć wartości początkowej', która została rozwiązana po prostu usunięciu resztkowego {} bloku po inicjalizacji, ala ta odpowiedź: http: // stackoverflow .com/a/36002958/4544328 –

Odpowiedz

145

if let/if var opcjonalne wiązanie działa tylko wtedy, gdy wynik po prawej stronie wyrażenia jest opcjonalny. Jeśli wynik po prawej stronie nie jest opcjonalny, nie można użyć tego opcjonalnego powiązania. Celem tego opcjonalnego wiązania jest sprawdzenie, czy dla nil używana jest zmienna tylko wtedy, gdy jest inna niż nil.

W twoim przypadku parametr tableView jest zadeklarowany jako nieobowiązkowy typ UITableView. Gwarantuje to, że nigdy nie będzie nil. Więc opcjonalne powiązanie tutaj jest niepotrzebne.

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) 

Wszystko co musimy zrobić, to pozbyć się if let i zmieniać żadnych wystąpień tv w nim po prostu tableView.

11

dla mojego konkretnego problemu musiałem zastąpić

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

Z

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

Najlepsza odpowiedź tego gościa zobacz komentarze https://stackoverflow.com/a/31039427/2797944 –

7

samo dotyczy straży oświadczenia. Ten sam komunikat o błędzie doprowadził mnie do tego postu i odpowiedzi (dzięki @nhgrif).

Kod: Wydrukuj nazwisko osoby, tylko jeśli drugie imię ma mniej niż cztery znaki.

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

}

Do oświadczyłem ostatni jako opcjonalny parametr widziałem ten sam błąd.

4

warunek wiążący musi mieć optinal typ co oznacza, że ​​można tylko powiązać wartości opcjonalne, jeśli niech oświadczenie

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


     } 
    } 
} 

to będzie działać dobrze, ale upewnij się, że podczas korzystania jeżeli niech to musi mieć optinal typu „?"

2

W przypadku, gdy używasz niestandardowego typu komórek, powiedzmy ArticleCell, może pojawi się błąd, który mówi:

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

Dostaniesz ten błąd, jeśli linia kodu wygląda mniej więcej tak:

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

można naprawić ten błąd, wykonując następujące czynności:

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

Jeśli zaznaczysz powyższe, zobaczysz, że ten ostatni używa opcjonalnego rzutowania dla komórki typu ArticleCell.

Powiązane problemy