Bedingte Bindung: if let error - Der Initialisierer für die bedingte Bindung muss den optionalen Typ haben

119

Ich versuche, eine Zeile aus meiner Datenquelle und der folgenden Codezeile zu löschen:

if let tv = tableView {

verursacht folgenden Fehler:

Der Initialisierer für die bedingte Bindung muss den optionalen Typ und nicht UITableView haben

Hier ist der vollständige Code:

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

Wie soll ich Folgendes korrigieren?

 if let tv = tableView {
Del Hinds
quelle
8
Da tableViewes sich nicht um einen optionalen Wert handelt, muss nicht überprüft werden, ob er Null ist oder nicht. Sie können es also direkt verwenden, ich meine, entfernen Sie es if let und verwenden Sie es einfach tableViewin der Funktion
Eric Qian
Für die Nachwelt , nachdem ich dieses Problem behoben, lief ich in variable with getter/setter cannot have an initial value, die durch einfaches Entfernen des übriggebliebenen {} Block nach der Initialisierung gelöst wurde, ala diese Antwort: stackoverflow.com/a/36002958/4544328
Jake T.

Antworten:

216

if let/ if varoptionale Bindung funktioniert nur, wenn das Ergebnis der rechten Seite des Ausdrucks optional ist. Wenn das Ergebnis der rechten Seite nicht optional ist, können Sie diese optionale Bindung nicht verwenden. Der Punkt dieser optionalen Bindung ist zu überprüfennil der Variablen zu suchen und sie nur zu verwenden, wenn sie nicht vorhanden ist nil.

In Ihrem Fall wird der tableViewParameter als nicht optionaler Typ deklariert UITableView. Es wird garantiert niemals sein nil. Eine optionale Bindung ist hier also nicht erforderlich.

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)

Alles, was wir tun müssen, ist das loszuwerden if letund alle Vorkommen tvin ihm auf gerecht zu ändern tableView.

nhgrif
quelle
17

für mein spezifisches Problem musste ich ersetzen

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

Mit

let count = 1
if(count > 0)
    {
        // do something ...
    }
Jacksonkr
quelle
2
Beste Antwort von diesem Kerl siehe die Kommentare stackoverflow.com/a/31039427/2797944
Shauket Sheikh
16

In einem Fall, in dem Sie einen benutzerdefinierten Zelltyp verwenden, z. B. ArticleCell, wird möglicherweise die folgende Fehlermeldung angezeigt:

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

Sie erhalten diesen Fehler, wenn Ihre Codezeile ungefähr so ​​aussieht:

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

Sie können diesen Fehler wie folgt beheben:

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

Wenn Sie das oben Gesagte überprüfen, werden Sie feststellen, dass letzteres optionales Casting für eine Zelle vom Typ ArticleCell verwendet.

Lehlohonolo_Isaac
quelle
In meinem Fall musste ichas! ArticleCell?
lilbiscuit
9

Gleiches gilt für die Wache . Die gleiche Fehlermeldung führte mich zu diesem Beitrag und der Antwort (danke @nhgrif).

Der Code: Gibt den Nachnamen der Person nur aus, wenn der zweite Vorname weniger als vier Zeichen umfasst.

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

Bis ich last als optionalen Parameter deklariert habe, wurde der gleiche Fehler angezeigt.

Paul Tader
quelle
4

Die Bedingungsbindung muss einen optinalen Typ haben. Dies bedeutet, dass Sie nur optionale Werte in der if let-Anweisung binden können

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


        }
    }
}

Dies wird gut funktionieren, aber stellen Sie sicher, wenn Sie es verwenden, wenn es den Optinaltyp "?"

Viraler Schah
quelle
0

Nun, es wäre immer noch praktisch (syntaktisch), wenn wir die üblichen Werte innerhalb der if-Bedingung deklarieren könnten. Hier ist ein Trick: Sie können den Compiler glauben lassen, dass es eine Zuordnung Optional.some(T)zu einem Wert wie dem folgenden gibt:

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
Artem Ilyumzhinov
quelle