Swift facultatif inout paramètres et nul
Est-il possible d'avoir un Optional
inout
paramètre à une fonction dans Swift? Je suis en train de le faire:
func testFunc( inout optionalParam: MyClass? ) {
if optionalParam {
...
}
}
...mais quand j'essaie de l'appeler et de passer nil
il me donne une étrange erreur de compilation:
Type 'inout MyClass?' does not conform to protocol 'NilLiteralConvertible'
Je ne vois pas pourquoi ma classe doit se conformer à certaines protocole spécial quand il est déjà déclaré comme une option.
source d'informationauteur devios1
Vous devez vous connecter pour publier un commentaire.
Il ne compile pas parce que la fonction attend une référence, mais que vous avez passé
nil
. Le problème n'ont rien à voir avec, en option.En déclarant paramètre avec
inout
signifie que vous allez affecter une valeur à l'intérieur du corps de la fonction. Comment peut-il attribuer de la valeur ànil
?Vous avez besoin de l'appeler comme
Si vous connaissez le C++, c'est le C++ version de votre code sans option
et vous avez ce message d'erreur
qui est une sorte d'équivalent à la sur vous obtenu (mais plus facile à comprendre)
C'est possible, et il peut tout à voir avec le Fermeture.()
L'option peut avoir une valeur nulle, mais il n'attend pas de néant. Donc, l'option serait de travailler tout simplement si vous n'avez pas le passer à la fonction ou le passé d'une variable de type Maclasse? avec une valeur nulle. Comme Bryan unis.
Lorsque vous écrivez la fonction qu'il doit avoir une valeur par défaut d'une option param:
Avis
if optionalParam {...}
est changé àif optionalParam != nil {...}
vous ne pouvez PAS uwwrap
optionalParam
sans vérification,c'est à direif optionalParam? != nil
comme uwrapping,optionalParam?
échoue lorsqueoptionalParam==nil
. ~note,var a :MyClass?
a une valeur de zéro jusqu'à ce qu'il est attribué.Appel est soit,
testFunc(optionalParam:&a)
outestFunc()
mais jamaistestFunc(nil)
Pense que vous pouvez peut-être obtenir deux différents concepts liés que ils ont des noms similaires, en option paramètres et options. Options sont variables avec une étendue néant condition. Les paramètres facultatifs sont fonction des paramètres qui sont facultatifs.
Lecture ici. Apple est d'essayer de changer le verbiage de paramètre facultatif de "paramètres avec des valeurs par défaut'. Il est regrettable qu'ils n'ont pas l'incorporer paramètre facultatif comportement au sein de ces nouvelles facultatif des bidules. Quel est le point de passage néant options comme options si elles échouent lorsque déballé. Peut-être que c'est plus profonde au cœur de ce que cette chose est si elle peut être passé avant de déballer... du chat de Schrödinger
L'exacte passage de la docs est:
Noter, cependant, que (édité) par @gnasher commentaire, vous avez seulement besoin de passer une classe inout (aka par référence), si vous avez l'intention ou souhaitez autoriser pour que l'instance soit d'être remplacé par une autre instance, et pas seulement l'original modifié. Le passage dans la documentation qui couvre ce n'est:
Voici trois tests qui couvrent l'utilisation de la var et inout.
En fait ce que @devios1 besoins est "facultatif" pointeur.
Mais inout MyClass? signifie "pointeur vers une option".
Les éléments suivants doivent travailler dans Swift 4
C'est possible, mais vous devez remplacer la "inout" avec 'var'
Cela ne fonctionne que pour la Classe des arguments, pas pour les Struct. Un objet de classe est passé comme un pointeur, le "inout" modificateur n'est pas nécessaire (et en fait une erreur).
Le 'var' attribut doit être ajoutée puisque vous voulez modifier sa valeur à l'intérieur de la fonction.