Swift 101 - Travailler avec les nouvelles valeurs optionnelles de Swift

Le langage de programmation Swift possède une nouvelle fonctionnalité appelée optionals qui n’était pas disponible auparavant dans Objective-C. Ils sont similaires aux types facultatifs en Java et aux types nullables en langage de programmation C #.

Pourquoi utiliser les optionnels?

Vous pensez peut-être «Je peux ignorer les options - c'est une fonctionnalité que je n'utiliserai jamais», mais je vous recommande de lire davantage. Vous constaterez que vous devez utiliser des options dans Swift si vous avez besoin d’une valeur nulle.

Les valeurs facultatives de Swift vous permettent d’être plus précis dans votre code en vous permettant de spécifier quand il est correct de laisser une valeur particulière vide (et quand ce n’est pas le cas!). Cela vous permet d’éviter les erreurs de programmation courantes dans votre application valeur nulle inattendue.

Les options de Swift aident également le code de votre application à refléter plus fidèlement la capacité que vous avez déjà dans Core Data d'indiquer qu'un attribut d'entité particulier est facultatif. Comme le montre la figure 1, vous pouvez spécifier le type d'un attribut (String, dans ce cas) et indiquer si la valeur est facultative.

Figure 1 - Vous pouvez spécifier qu'un attribut d'entité Core Data est facultatif.

Maintenant, Swift vous permet de faire la même chose avec vos propriétés et vos variables. Voici une déclaration optionnelle équivalente dans Swift:

var middleName: String?

Cette déclaration crée une variable nommée middleName de type String . Le point d'interrogation ( ? ) Après le type de variable String indique que la variable middleName peut contenir une valeur pouvant être une chaîne ou nil . Quiconque regarde ce code sait immédiatement que middleName peut être nul . C'est auto-documenté!

Si vous ne spécifiez pas de valeur initiale pour une constante ou une variable facultative (comme indiqué ci-dessus), la valeur est automatiquement définie sur nil pour vous. Si vous préférez, vous pouvez explicitement définir la valeur initiale sur nil:

var middleName: String? = nil

Voyons maintenant comment nil est utilisé dans Swift.

nul à Swift

Cela peut ne pas sembler évident au premier abord, mais seuls les optionnels peuvent être nuls . Comme indiqué dans le manuel The Swift Programming Language d’ Apple (disponible gratuitement dans iBooks Store):

nil ne peut pas être utilisé avec des constantes et des variables non facultatives. Si une constante ou une variable de votre code doit pouvoir gérer l'absence de valeur dans certaines conditions, déclarez-la toujours en tant que valeur facultative du type approprié.

Cela signifie que vous ne pouvez pas faire quelque chose comme ceci, car la variable firstName n'est pas marquée avec un point d'interrogation pour indiquer qu'il s'agit d'une option:

var firstName: String = nil

Ce code produit l'erreur de temps de compilation suivante:

Le type 'String' n'est pas conforme au protocole 'NilLiteralConvertible' .

Il est également important de noter que zéro dans Swift est différent de zéro dans Objective-C. En Objective-C, nil est un pointeur sur un objet inexistant. Dans Swift, nil indique simplement l'absence d'une valeur - ce n'est pas un pointeur. Cela signifie que vous pouvez spécifier des options de tout type, pas seulement des types d'objet.

Accéder aux valeurs optionnelles

Contrairement à d'autres langages de programmation, dans Swift, vous ne pouvez pas accéder directement à une valeur optionnelle . Vous devez d'abord déballer l'option facultative pour accéder à sa valeur sous-jacente. Prenons par exemple le code suivant:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

firstAndMiddleNames = firstName + "" + middleName

Les trois premières lignes de code déclarent une variable firstName String, une variable optionnelle String middleName et une variable firstAndMiddleNames String. La ligne de code suivante concatène (joint) les valeurs de variable firstName et middleName avec un espace entre elles. Vous serez peut-être surpris de constater que cette ligne de code génère l'erreur de temps de compilation suivante:

Valeur du type d'option 'String?' non déballé; vouliez-vous utiliser '!' ou '?'?

C'est l'un des mécanismes de protection de Swift. Cela vous oblige à reconnaître qu'une valeur peut éventuellement être nulle . Alors, comment déballez-vous une option? Il existe deux manières principales, décrites dans les sections suivantes.

Utilisation du déballage forcé pour les options

Comme suggéré par l'erreur du compilateur dans la section précédente, un moyen de décompresser une valeur facultative consiste à utiliser le point d'exclamation (!) Après le paramètre optionnel pour le décompresser explicitement. Par exemple:

firstAndMiddleNames = firstName + " " + middleName!

Ceci force manuellement la valeur du middleName optionnel à être décompressée . Toutefois, si middleName contient la valeur nil au moment de l'exécution, cela générera une erreur d' exécution EXC_BAD_INSTRUCTION . Donc, vous ne voudrez évidemment pas utiliser le décompression forcée à moins d'être absolument sûr que la valeur n'est pas nulle .

Utilisation de la liaison facultative pour dérouler les options

Vous pouvez utiliser une technique appelée liaison facultative pour vérifier si une facultative contient une valeur et, le cas échéant, la stocker dans une variable temporaire ou une constante. Pour montrer comment cela fonctionne avec notre exemple précédent, consultez ce code:

var firstName: String = "Ryan"

var middleName: String? = "Michael"

var firstAndMiddleNames: String

si laissez middle = middleName

{

firstAndMiddleNames = prenom + "" + milieu

}

autre

{

firstAndMiddleNames = firstName

}

Lorsque la condition if est vérifiée à l'exécution, si la variable middleName contient une valeur String, la condition est évaluée à true, la valeur contenue dans la variable middleName est déballée, stockée dans la constante du milieu et le code entre accolades dans l'instruction if . est exécuté.

Si la variable middleName contient la valeur nil, la condition est évaluée à false, la valeur facultative n'est pas décompressée et le code figurant entre les accolades de l'instruction else est exécuté.

Options implicitement non emballées

Swift a aussi quelque chose appelé optionnel implicitement non enveloppé. Ce sont des options qui n'ont pas besoin d'être décompressées à l'aide de la décompression forcée (!) Ou de la liaison facultative, car elles sont décompactées implicitement (automatiquement). Ils sont déclarés à l'aide d'un point d'exclamation (!) Plutôt que d'un point d'interrogation (?).

Vous voyez souvent des options implicites non enveloppées lorsque vous travaillez avec des sorties Interface Builder (propriétés IBOutlet ). Par exemple:

@IBOutlet weak var lblDescription: UILabel!

Dans ce code, la propriété de sortie lblDescription est précédée d' un point d'exclamation, indiquant qu'elle est implicitement décompressée. Cela vous permet d'accéder à la propriété sans la déballer.

Dans cet exemple, il n'est pas garanti que la propriété de sortie contienne une référence à une étiquette, mais elle le devrait absolument. S'il ne contient pas de référence à une étiquette, cela signifie que la connexion entre la sortie et l'étiquette a été rompue. Dans ce cas, il est correct d'avoir une erreur d'exécution parce que vous voulez savoir que la connexion est rompue afin de pouvoir la réparer!

Évidemment, dans les cas où vous n'êtes pas sûr à 100% qu'une constante ou une variable contienne une valeur, vous devez utiliser une option normale.

Conclusion

Les options sont une nouvelle fonctionnalité de Swift qui vous permet de gérer en toute sécurité des valeurs nulles dans vos applications iOS. Je vous recommande de relire ce message à quelques reprises pour vous assurer de bien comprendre les concepts de base, puis de revenir au manuel de Swift Programming Language d’Apple pour en savoir plus sur la façon dont les options sont utilisées dans Swift.