126 votes

Les paramètres "var" sont obsolètes et seront supprimés dans Swift 3.

Bon, je viens de mettre à jour Xcode à 7.3 et maintenant j'ai cet avertissement :

Les paramètres "var" sont obsolètes et seront supprimés dans Swift 3.

Comment résoudre ce problème lorsque j'ai besoin d'utiliser le var dans cette fonction :

public func getQuestionList(var language: String) -> NSArray {
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

6 votes

Et si public func getQuestionList(inout language: String) -> NSArray

2 votes

Non, ce n'est pas un remplacement approprié. L'OP ne veut probablement pas getQuestion d'avoir des effets secondaires.

6 votes

Honnêtement, je n'ai aucune idée de la raison pour laquelle ils envisageraient même de supprimer ça. C'était l'une des caractéristiques qui rendait Swift génial !

104voto

Tr0yJ Points 31

La discussion sur la suppression du Var d'un paramètre de fonction est entièrement documentée dans cette soumission sur GitHub : Supprimer les paramètres du Var

Dans ce document, vous constaterez que les gens confondent souvent var paramètres avec inout paramètres. A var signifie simplement que le paramètre est mutable dans le contexte de la fonction, alors qu'avec un paramètre inout la valeur du paramètre au point de retour sera copiée hors de la fonction et dans le contexte de l'appelant.

La façon correcte de résoudre ce problème est de supprimer var du paramètre et introduire une var variable. En haut de la routine, copiez la valeur du paramètre dans cette variable.

49 votes

Je ne comprends pas du tout ce changement, pourquoi le fait de devoir écrire une autre ligne pour créer une variable locale mutable serait-il mieux que de simplement définir le paramètre comme une variable ?

0 votes

Pour moi, ce changement est une bonne chose car il permet de repérer les situations où j'aurais dû implémenter une variable locale mais où je ne l'ai pas fait parce que j'ai choisi la solution de facilité et accepté la suggestion de l'(ancien) Swift de faire du paramètre d'entrée un var.

4 votes

Je suis avec @RossBarbish sur ce point. Donc... c'est supprimé parce que les développeurs paresseux ne peuvent pas distinguer les paramètres inout et var ? Pfff...

83voto

garanda Points 679

Avez-vous essayé d'affecter à une nouvelle var

public func getQuestionList(language: String) -> NSArray {
    var lang = language
    if self.data.count > 0 {
        if (lang.isEmpty) {
            lang = "NL"
        }
        return self.data.objectForKey("questionList" + lang) as! NSArray
    }

    return NSArray()
}

11 votes

Pas vraiment ce que je pense que le PO voulait

6 votes

J'aurais compris la question de l'OP de la même manière que @garana. L'OP n'utilise pas inout dans sa question, il ne fait que muter une variable préexistante. localement .

0 votes

Tout à fait d'accord, donc je ne sais pas pourquoi @brimstone a déclassé ma réponse. La question de l'OP concerne la mutation d'une valeur.

65voto

Harris Points 916

Il suffit d'ajouter cette ligne au début de la fonction :

var language = language

et le reste de votre code peut rester inchangé, comme ceci :

public func getQuestionList(language: String) -> NSArray {
    var language = language
    if self.data.count > 0 {
        if (language.isEmpty) {
            language = "NL"
        }
        return self.data.objectForKey("questionList" + language) as! NSArray
    }

    return NSArray()
}

5 votes

La meilleure réponse de loin. Il suffit de changer une seule ligne.

1 votes

Mais ça semble si peu naturel @James

1 votes

Je pense que c'est la meilleure solution car elle permet de conserver le même nom. Comme dans les autres langues courantes.

13voto

timvermeulen Points 1000

Beaucoup de gens suggèrent une inout paramètre, mais ce n'est pas vraiment pour ça qu'ils sont conçus. De plus, cela ne permet pas d'appeler la fonction avec un paramètre let ni avec une chaîne de caractères littérale. Pourquoi ne pas simplement ajouter la valeur par défaut à la signature de la fonction ?

public func getQuestionList(language language: String = "NL") -> NSArray {
    if data.count > 0 {
        return data.objectForKey("questionList" + language) as! NSArray
    } else {
        return NSArray()
    }
}

Assurez-vous juste de ne pas appeler getQuestionList avec la chaîne vide au cas où vous voudriez la langue par défaut, mais sans le paramètre :

let list = getQuestionList() // uses the default "NL" language

3 votes

Je ne comprends pas non plus pourquoi tout le monde a sauté sur la solution inout alors que l'OP ne l'utilisait même pas au début...

1 votes

Ils supposaient que var et inout faisaient la même chose.

0voto

Simone Pistecchia Points 432

Je pense que les réponses de @Harris et @garanda sont la meilleure approche.

De toute façon dans votre cas, il n'y a pas besoin d'une var, vous pouvez le faire :

public func getQuestionList(language: String) -> NSArray {
    if self.data.count > 0 {
        return self.data.objectForKey("questionList" + (language.isEmpty ? "NL" : language)) as! NSArray
    }
    return NSArray()
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X