English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift Optional Types (Optional)

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.

Example1:如何在Swift中声明一个可选的?

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.

Example2:从可选对象分配和访问值

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.

Example3:显式声明一个未包装的可选

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.

Example4:Erreur fatale lors de l'accès à un objet optionnel non déserialisé

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.

Traitement optionnel

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 :

1.Instruction if

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.

Example5:Traitement optionnel de l'instruction if else

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.

2.Association optionnelle (if let)

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.

Example5:使用if let语句的可选处理

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.

3.Instruction guard

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.

Example6:使用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.

4.Opérateur de concision (??)

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.

Example7:使用空合运算符的可选处理

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.