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 {

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.



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.


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.


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


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
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.