Próbuję usunąć wiersz z mojego źródła danych i następujący wiersz kodu:
if let tv = tableView {
powoduje następujący błąd:
Inicjator dla powiązania warunkowego musi mieć typ opcjonalny, a nie 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)
Jak mam poprawić poniższe?
if let tv = tableView {
ios
swift
optional-binding
Del Hinds
źródło
źródło
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 tegoif let
i po prostu użyjtableView
w funkcjivariable with getter/setter cannot have an initial value
który został rozwiązany po prostu przez usunięcie pozostałego bloku {} po inicjalizacji, ala ta odpowiedź: stackoverflow.com/a/36002958/4544328Odpowiedzi:
if let
/if var
opcjonalne wiązanie działa tylko wtedy, gdy wynik prawej strony wyrażenia jest opcjonalny. Jeśli wynik po prawej stronie nie jest opcjonalny, nie możesz użyć tego opcjonalnego wiązania. Celem tego opcjonalnego powiązania jest sprawdzenienil
i użycie zmiennej tylko wtedy, gdy nie jestnil
.W twoim przypadku
tableView
parametr jest zadeklarowany jako typ nieopcjonalnyUITableView
. Gwarantujemy, że nigdy nie będzienil
. Więc opcjonalne wiązanie tutaj jest niepotrzebne.Wszystko, co musimy zrobić, to pozbyć się tego
if let
i zmienić wszelkie występującetv
w nim wystąpienia na sprawiedliwetableView
.źródło
dla mojego konkretnego problemu musiałem wymienić
Z
źródło
W przypadku korzystania z niestandardowego typu komórki, na przykład ArticleCell, możesz otrzymać komunikat o błędzie:
Otrzymasz ten błąd, jeśli linia kodu wygląda mniej więcej tak:
Możesz naprawić ten błąd, wykonując następujące czynności:
Jeśli zaznaczysz powyższe, zobaczysz, że ta ostatnia używa opcjonalnego rzutowania dla komórki typu ArticleCell.
źródło
as! ArticleCell?
To samo dotyczy instrukcji strażnika . Ten sam komunikat o błędzie prowadzi mnie do tego postu i odpowiedzi (dzięki @nhgrif).
Kod: Drukuj nazwisko osoby tylko wtedy, gdy drugie imię ma mniej niż cztery znaki.
Dopóki nie zadeklarowałem ostatniego jako parametru opcjonalnego, widziałem ten sam błąd.
źródło
powiązanie warunku musi mieć typ opcjonalny, co oznacza, że można wiązać tylko wartości opcjonalne w instrukcji if let
To zadziała dobrze, ale upewnij się, że jeśli używasz, jeśli pozwolisz, musi mieć typ opcjonalny „?”
źródło
Cóż, nadal byłoby wygodne (składniowo), gdybyśmy mogli zadeklarować zwykłe wartości wewnątrz warunku if. Oto sztuczka: możesz sprawić, by kompilator pomyślał, że istnieje przypisanie
Optional.some(T)
do wartości w następujący sposób:źródło