285 votes

Qu'est-ce qu'une valeur optionnelle dans Swift?

À partir de la documentation d'Apple:

Vous pouvez utiliser if et let ensemble à travailler avec les valeurs que peut-être manquant. Ces valeurs sont représentées comme des options. Une valeur facultative contient une valeur ou contient nil à indiquer que la valeur est manquante. Écrire un point d'interrogation (?) après le type d'une valeur de marque de la valeur de l'option.

Pourquoi voudriez-vous d'utiliser une valeur facultative?

570voto

nevan king Points 46410

Une option dans Swift est une variable qui peut contenir une valeur ou sans valeur. Options sont écrits en ajoutant un ? le type:

var myOptionalString:String? = "Hello"

De "L'essentiel" dans le Langage de Programmation Swift:

Swift a également introduit en option types, la poignée de l'absence de valeur. Options-dire "il y a une valeur, et il est égal à x" ou "il n'y a pas une valeur à tous". Options sont similaires à l'aide de nul avec les pointeurs en Objective-C, mais ils travaillent pour n'importe quel type, pas seulement les classes. Options sont plus sûrs et plus expressive que nul pointeurs en Objective-C, et sont au cœur de bon nombre de Swift fonctionnalités plus puissantes.

Options sont un exemple du fait que la Swift est un type de langage sûr. Swift vous permet d'être clair sur les types de valeurs de votre code peut fonctionner avec. Si une partie de votre code attend une Chaîne, le type de sécurité vous empêche de passer à un Int par erreur. Cela permet d'attraper et de corriger les erreurs le plus tôt possible dans le processus de développement.

Certains endroits, les options sont utiles:

  • Lorsqu'une propriété peut être là ou pas là, comme middleName ou spouse en Person classe
  • Lorsqu'une méthode peut retourner une valeur ou rien, comme à la recherche d'un match dans un tableau
  • Lorsqu'une méthode peut retourner un résultat ou obtenez un message d'erreur et renvoie rien
  • Délégué propriétés (qui ne doivent pas toujours être ensemble)
  • Pour weak propriétés dans les classes. La chose à point peut être réglé nil
  • Pour une ressource importante qui pourrait être libéré pour récupérer de la mémoire

Vous pouvez utiliser une option en tant que Boolean en if ou while déclaration. Voici un exemple de création d'une option, puis vérification de son existence:

var myString:String? = "Hello"

if myString {
    println(myString)
}

Si vous essayez de le faire à l'aide d'un non-type facultatif, il va donner une erreur de compilateur: "Type" Chaîne "n'est pas conforme à un protocole de LogicValue'"

var myOtherString:String = "Hello"

if myOtherString { // Error
    println(myOtherString)
}

Aussi, si vous tentez de définir un non-facultatif nil vous obtenez le message d'erreur "impossible de trouver une surcharge pour '__conversion "qui accepte les arguments fournis":

var myOtherString:String = nil // Error

Si une variable est déclarée comme une option, il peut être nil. En fait, toutes les options de démarrage d'une valeur de nil jusqu'à ce qu'ils sont définis à quelque chose:

var possibleString:String? = "Hello"
possibleString = nil

if possibleString {
    println("It's not nil")
}

Voici une façon d'utiliser les options:

var nameString:String? = "Zed" // could also be nil

if nameString {
    println("\(nameString)'s alive")
} else {
    println("Zed's dead")
}

Vous pouvez utiliser les options pour la vérification de l'existence d'une valeur dans un dictionnaire:

let users = [ "sjobs" : "Steve Jobs", "bgates" : "Bill Gates"]

let steve: String? = users["sjobs"]
if steve { // if steve != nil
    println("\(steve) is in the dictionary")
}

Il y a un raccourci pour vérifier si une valeur existe, de faire quelque chose avec elle. Vous pouvez convertir de ce style:

let possibleName: String? = users["ballmer"]

if possibleName {
    let foundName = possibleName! // Force out value with unwrap operator (!)
    println("Name: \(foundName)")
}

...de cette abréviation, qui dit "Si possibleName a une valeur, déballez-le et fixez sa valeur à foundName.

if let foundName = possibleName {
    println("Name: \(foundName)")
}

Vous utilisez un point d'exclamation "!" déballer le facultatif. Vous ne pouvez pas utiliser une option pour beaucoup (à l'exception de la vérification de sa nilness) jusqu'à ce qu'il est déballé. Notez que de déballer une option que l' nil va provoquer un plantage. Toujours vérifier qu'une valeur existe avant de déballer:

// Crash: fatal error: Can't unwrap Optional.
let name = possibleName!

Plus de la Swift guide:

Dans une instruction if, le conditionnel doit être une expression Booléenne, ce qui signifie que le code tel que if score { ... } est une erreur, pas une comparaison implicite à zéro.

Vous pouvez utiliser si et de les laisser ensemble, à collaborer avec les valeurs que peut-être manquant. Ces valeurs sont représentées comme des options. Une valeur facultative contient une valeur ou contient nul pour indiquer que la valeur est manquante. Écrire un point d'interrogation (?) après le type d'une valeur de marque de la valeur de l'option.

Il peut être utile de voir la même chose en Objective-C:

NSString *myString = @"Hello";
if (myString) {
    NSLog(@"%@", myString);
}

Objective-C est plus indulgent sur ce qu'il va permettre de dire "faux" (NO, 0, nil). Swift est plus restrictive et veut un booléen (ou quelque chose qui "déballe" à un booléen). En utilisant des options se débarrasse aussi de la nécessité pour les trucs comme NSNotFound et à l'aide de -1 pour représenter faux.


Plus de ressources:
Le Guide De Programmation Swift
Options de Swift (Moyen)
La WWDC Session 402 "présentation de Swift" (qui commence autour de 14:15)

Pour terminer, voici un poème à partir de 1899 sur les options:

Hier, lors de l'escalier
J'ai rencontré un homme qui n'était pas là
Il n'y a pas de nouveau aujourd'hui
Je souhaite, j'aurais aimé qu'il aille

Antigonish

16voto

John Riselvato Points 5217

Prenons l'exemple d'un NSError, si il n'y a pas une erreur renvoyés vous souhaitez le rendre facultatif à retourner Nil. Il n'y a aucun point dans l'attribution d'elle si il n'y a pas une erreur..

var error: NSError? = nil

Cela vous permet également d'avoir une valeur par défaut. Ainsi, vous pouvez définir une méthode, d'une valeur par défaut si la fonction n'est pas passé quelque chose

func doesntEnterNumber(x: Int? = 5) -> Bool {
    if (x == 5){
        return true
    } else {
        return false
    }
}

ou comme @Nil joliment mis il

Fondamentalement, une option de valeur est nulle ou quelque chose. Si c'est nul, le résultat de toute expression, c'est de néant.

12voto

rickster Points 19870

Vous ne pouvez pas avoir une variable qui pointe sur nil dans Swift - il n'y a pas de pointeurs ni de pointeurs nuls. Mais dans une API, vous voulez souvent pouvoir indiquer soit un type de valeur spécifique, soit un manque de valeur - par exemple, ma fenêtre a-t-elle un délégué et, dans l'affirmative, de qui s'agit-il? Les options sont un moyen sûr, pour la mémoire et le type de Swift.

7voto

Gokul Points 76

En objective C une variable sans valeur égale à 'nil'(il est également possible d'utiliser des " nil "valeurs de même que le 0 et le faux), il est donc possible d'utiliser des variables dans les expressions conditionnelles (Variables ayant des valeurs sont les mêmes que les "VRAIS" et ceux qui n'ont aucune valeurs étaient égales à 'FALSE').

Swift fournit le type de sécurité en fournissant, en option, la valeur". c'est à dire qu'Il permet d'éviter des erreurs formé à partir de l'affectation des variables de types différents.

Donc, en Rapide, seulement les booléens peuvent être fournis sur les instructions conditionnelles.

var hw = "Hello World"

Ici, même si la " hw " est une chaîne de caractères, il ne peut pas être utilisé dans une instruction if comme en objective C.

//This is an error

if hw

 {..}

Pour cela, il doit être créé comme,

var nhw : String? = "Hello World"

//This is an correct

if nhw

 {..}

4voto

Chris Prince Points 798

Juste un commentaire sur l'une des réponses ci-dessus.

Dans Xcode6.0.1, le code suivant génère une erreur:

     var myString:String? = "Hello"

    if myString {
        println(myString)
    }
 

sur la ligne if, il est indiqué que le type facultatif ne peut pas être utilisé comme booléen.

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