English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans cet article, vous allez apprendre les options, leurs cas d'utilisation et la gestion des options dans Swift.
Dans l'article précédent, nous avons découvert différents types de données disponibles dans Swift, et nous avons également noté que les variables ou constantes déclarées de ces types contiennent des valeurs par défaut.
Exemple :
let someValue = Int() print(someValue)
When the program is run, the output is:
0
Mais Swift a également un autre type de données appelé Optional, qui a une valeur par défaut de nil. Si vous souhaitez que la variable ou la constante ne contienne aucune valeur, vous pouvez utiliser Optional. Le type optionnel peut contenir une valeur ou ne pas en contenir une (valeur vide).
Techniquement, vous pouvez le considérer comme une boîte à chaussures optionnelle. La boîte à chaussures peut contenir des chaussures ou pas. Par conséquent, avant de sortir les chaussures de la boîte, vous devriez savoir à l'avance.
Vous pouvez représenter simplement le type de données comme Optional en ajoutant. La méthode consiste à ajouter ! ou ? à un type. Si la variable optionnelle contient une valeur, son valeur est retournée comme Optional <Value>, sinon nil.
var someValue: Int? var someAnotherValue:Int! print(someValue) print(someAnotherValue)
When the program is run, the output is:
nil nil
Dans le programme ci-dessus, nous avons utilisé ? et ! pour initialiser un type optionnel. Les deux méthodes peuvent créer un type optionnel, mais il y a une principale différence que nous explorerons ci-dessous.
Déclarer un Int optionnel signifie que la variable aura une valeur entière ou aucune valeur. Comme aucune valeur n'a été assignée à la variable, vous pouvez voir deux print statements affichant nil à l'écran.
let someValue: Int? = 5 print(someValue) print(someValue!)
When the program is run, the output is:
Optional(5) 5
Dans le programme ci-dessus, nous avons déclaré un type optionnel Int et y avons assigné une valeur5.
Enregistrer un optionnel en utilisant print(someValue) ne vous renverra pas5,而是为Optional(5) prend la forme suivante : Optional <Value>. Pour accéder à <Value>, nous avons besoin d'un mécanisme appelé dépaquetage (unwrapping) via le mécanisme.
Vous pouvez dépaqueter un variable/Ajoutez le caractère ! à la fin d'une constante pour étendre le contenu optionnel, comme dans la ligne suivante : print(someValue!). print(someValue!) dépaquète le contenu optionnel et l'affiche à l'écran 5.
Mais souvenez-vous, n'utilisez ce mécanisme de dépaquetage que lorsque vous êtes sûr que l'optionnel visité aura une valeur.
Vous pouvez également créer un contenu optionnel dépaqueté de la manière suivante :
let someValue:Int! = 5 print(someValue)
When the program is run, the output is:
5
Dans le programme ci-dessus, Int! crée un contenu optionnel non enveloppé, qui dépaquettera automatiquement la valeur lors de l'accès, donc vous n'avez pas besoin de taper le ! à chaque fois.
Assurez-vous que les variables ont toujours une valeur lors de l'accès à ces options optionnelles. Sinon, cela entraînera un plantage fatal.
var someValue: Int! var unwrappedValue: Int = someValue //crashes due to this line
Lorsque vous exécutez ce programme, vous obtiendrez un plantage fatal : plantage lors de la désérialisation d'une valeur optionnelle en découvrant accidentellement nil, car le code unwrappedValue:Int = someValue tente d'affecter la valeur de l'optionnelle someValue à la variable unwrappedValue.
Mais, somevalue est un type optionnel contenant une valeur nil. Tenter d'affecter une valeur nil à la variable unwrappedValue (ce n'est pas un Optional) entraînera un plantage.
Je vais expliquer les différentes méthodes pour traiter cette situation.
Pour utiliser une valeur optionnelle, il est nécessaire de la désérialiser. Une meilleure méthode pour utiliser les valeurs optionnelles est la désérialisation conditionnelle plutôt que l'utilisation de l'opérateur ! pour forcer la désérialisation.
C'est parce que la désérialisation conditionnelle interrogeVérifiez si cette variable a une valeur ?。Si c'est le cas, fournissez cette valeur, sinon traitez le cas nil.
En revanche, la désérialisation forcée indique que cette variable a effectivement une valeur lors de son utilisation. Par conséquent, lorsque vous forcez la désérialisation d'une variable nil, votre programme lève une exception optionnelle et plante lorsque vous découvrez accidentellement nil. Voici quelques astuces pour la désérialisation conditionnelle :
Vous pouvez utiliser une instruction if pour comparer les paramètres optionnels avec nil pour déterminer si les paramètres optionnels contiennent une valeur. Vous pouvez utiliser les opérateurs de comparaison "égal à" (==) ou "différent de" (!=) dans l'instruction if.
var someValue: Int? var someAnotherValue: Int! = 0 if someValue != nil { print("Contient une valeur \(someValue!)") } print("Ne contient pas de valeur") } if someAnotherValue != nil { print("Contient une valeur \(someAnotherValue!)") } print("Ne contient pas de valeur") }
When the program is run, the output is:
Ne contient pas de valeur Contient une valeur 0
Dans le programme ci-dessus, si l'expression optionnelle contient une valeur, l'exécution du code à l'intérieur de l'instruction if est effectuée, sinon, les instructions du bloc else sont exécutées. La principale faiblesse de cette méthode de traitement des options est que vous devez toujours utiliser l'opérateur ! pour désérialiser la valeur à partir de l'optionnelle.
L'association optionnelle peut vous aider à déterminer si la valeur optionnelle contient une valeur. Si la valeur optionnelle contient une valeur, cette valeur peut être utilisée comme constante ou variable temporaire. Par conséquent, l'association optionnelle peut être utilisée avec une instruction if pour vérifier la valeur à l'intérieur de l'optionnelle et l'extraire en tant que constante ou variable dans une seule opération.
var someValue: Int? var someAnotherValue: Int! = 0 if let temp = someValue { print("Contient une valeur \(temp)") } print("Ne contient pas de valeur") } if let temp = someAnotherValue { print("Contient une valeur \(temp)") } print("Ne contient pas de valeur") }
When the program is run, the output is:
Ne contient pas de valeur Contient une valeur 0
Dans le programme ci-dessus, si l'instruction optionnelle contient une valeur, exécutez le code de l'instruction if. Sinon, le bloc else est exécuté. if-La déclaration let dépaquet automatiquement cette valeur et stocke la valeur dépaquetée dans la constante temp. L'avantage principal de cette méthode est que, même si vous pouvez déterminer que le contenu optionnel contient une valeur, vous n'avez pas besoin de dépaqueter forceément cette valeur.
Vous pouvez également utiliser l'instruction guard dans Swift pour traiter le contenu optionnel. Si vous ne savez pas ce que c'est guard, ne vous inquiétez pas. Pour le moment, considérez guard comme if-Il n'y a pas de condition de bloc else pour empêcher. Si la condition échoue, l'instruction else est exécutée. Sinon, l'instruction suivante est exécutée. Pour plus de détails, voirSwift Guard.
func testFunction() { let someValue: Int? = 5 guard let temp = someValue else { return } print("Il a une valeur \(temp)") } testFunction()
When the program is run, the output is:
Il a une valeur 5
Dans le programme ci-dessus, guard contient une condition, à savoir si l'optionnelle someValue contient une valeur. Si elle contient une valeur, alors guard-La déclaration let dépaquet automatiquement cette valeur et place la valeur dépaquetée dans la constante temp. Sinon, le bloc else est exécuté et il retourne à la fonction d'appel. Comme l'optionnelle contient une valeur, la fonction print est appelée. Pour plus de détails, voir Swift guard.
Dans Swift, vous pouvez également utiliser l'opérateur de concision pour vérifier si une optionnelle contient une valeur. Il est défini comme (a??b). Il développe une optionnelle a, et si elle contient une valeur, elle la retourne, ou si a est nulle, elle retourne la valeur par défaut b.
var someValue: Int! let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
When the program is run, the output is:
5
In the above program, the variable someValue is defined as optional and contains a nil value. The nil-coalescing operator cannot unwrap the optional value, so it returns defaultValue. Therefore, the statement print(unwrappedValue) outputs in the console5.
var someValue: Int? = 10 let defaultValue = 5 let unwrappedValue: Int = someValue ?? defaultValue print(unwrappedValue)
When the program is run, the output is:
10
However, in the above program, the optional variable someValue is initialized with the value10. Therefore, the nil-coalescing operator successfully unwraps the value someValue. Therefore, the statement someValue ?? defaultValue returns in the console10The statement print(unwrappedValue) outputs10.