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

120

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 le type facultatif, pas 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 {
Del Hinds
la source
8
puisqu'il tableViewne s'agit pas d'une valeur optionnelle, il n'est pas nécessaire de vérifier si elle est nulle ou non. Vous pouvez donc l'utiliser directement, je veux dire supprimer cela if let et simplement l'utiliser tableViewdans la fonction
Eric Qian
Pour la postérité, après avoir résolu ce problème, je suis tombé sur variable with getter/setter cannot have an initial value, qui a été résolu en supprimant simplement le bloc restant {} après l'initialisation, ala cette réponse: stackoverflow.com/a/36002958/4544328
Jake T.

Réponses:

216

if let/ La if varliaison 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 vérifier nilet de n'utiliser la variable que si elle n'est pas nil.

Dans votre cas, le tableViewparamètre est déclaré comme le type non facultatif UITableView. Il est garanti de ne jamais l'être nil. La liaison facultative ici n'est donc pas nécessaire.

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 letet de changer toute occurrence de tvcelui-ci en juste tableView.

nhgrif
la source
17

pour mon problème spécifique, j'ai dû remplacer

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

Avec

let count = 1
if(count > 0)
    {
        // do something ...
    }
Jacksonkr
la source
2
Meilleure réponse de ce gars voir les commentaires stackoverflow.com/a/31039427/2797944
Shauket Sheikh
16

Dans le cas où vous utilisez un type de cellule personnalisé, par exemple ArticleCell, vous pouvez obtenir une erreur indiquant:

    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 ce qui précède, vous verrez que ce dernier utilise un casting optionnel pour une cellule de type ArticleCell.

Lehlohonolo_Isaac
la source
Dans mon cas, j'avais besoin d'utiliseras! ArticleCell?
lilbiscuit
9

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

Le code: n'imprimez le nom de famille de la personne que si le deuxième prénom comporte 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 le dernier en tant que paramètre facultatif, je voyais la même erreur.

Paul Tader
la source
4

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

Viral Shah
la source
0

Eh bien, ce serait toujours pratique (syntaxiquement) si nous pouvions déclarer les valeurs habituelles dans la condition if. Alors, voici une astuce: vous pouvez faire croire au compilateur qu'il y a une affectation de Optional.some(T)à une valeur comme celle-ci:

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