web-dev-qa-db-fra.com

Liaison conditionnelle: if let error - L'initialiseur pour la liaison conditionnelle doit avoir un type facultatif

J'essaie de supprimer une ligne de ma source de données et la ligne de code suivante:

if let tv = tableView {

provoque l'erreur suivante:

L'initialiseur pour la liaison conditionnelle doit avoir un type facultatif et non UITableView

Voici le code complet:

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

Comment dois-je corriger ce qui suit?

 if let tv = tableView {
104
Del Hinds

if let/if var la liaison facultative ne fonctionne que lorsque le résultat du côté droit de l'expression est facultatif. Si le résultat du côté droit n'est pas facultatif, vous ne pouvez pas utiliser cette liaison facultative. Le but de cette liaison facultative est de rechercher nil et de n'utiliser la variable que si elle est différente de_nil.

Dans votre cas, le paramètre tableView est déclaré comme type non facultatif UITableView. Il est garanti de ne jamais être nil. La liaison facultative est donc inutile.

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)

Tout ce que nous avons à faire est de nous débarrasser du if let et de changer toutes les occurrences de tv dans celui-ci en simplement tableView.

194
nhgrif

pour mon problème spécifique je devais remplacer

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

Avec

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

Dans le cas où vous utilisez un type de cellule personnalisé, par exemple ArticleCell, vous pourriez recevoir une erreur qui dit:

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

Vous obtiendrez cette erreur si votre ligne de code ressemble à ceci:

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

Vous pouvez corriger cette erreur en procédant comme suit:

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

Si vous cochez la case ci-dessus, vous verrez que cette dernière utilise la conversion facultative pour une cellule de type ArticleCell.

14

Il en va de même pour les déclarations guard. Le même message d'erreur m'a conduit à ce message et à sa réponse (merci @nhgrif).

Le code: N'imprimez le nom de famille de la personne que si le deuxième prénom contient moins de quatre caractères.

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

}

Jusqu'à ce que je déclare last en tant que paramètre facultatif, je voyais la même erreur.

8
Paul Tader

la liaison de condition doit avoir un type optinal, ce qui signifie que vous ne pouvez lier que des valeurs facultatives dans l'instruction 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? {


        }
    }
}

Cela fonctionnera bien, mais assurez-vous lors de l'utilisation si laissez-le avoir le type optinal "?"

4
Viral Shah