Swift accorde une grande importance à la sécurité du type. L'ensemble du langage Swift a été conçu dans un souci de sécurité. C'est l'une des caractéristiques de Swift et que vous devriez accueillir à bras ouverts. Il aidera au développement d'un code propre et lisible et aidera à empêcher votre application de planter.
Toutes les options de Swift sont délimitées par le ?
symbole. En définissant le ?
après le nom du type dans lequel vous déclarez comme facultatif, vous ne transtypez pas essentiellement le type dans lequel se trouve avant le ?
, mais plutôt comme le type facultatif .
Remarque: Une variable ou un type Int
n'est pas le même que Int?
. Ce sont deux types différents qui ne peuvent pas être utilisés l'un sur l'autre.
Utilisation facultative
var myString: String?
myString = "foobar"
Cela ne signifie pas que vous travaillez avec un type de String
. Cela signifie que vous travaillez avec un type de String?
(String Optional ou Optional String). En fait, chaque fois que vous essayez de
print(myString)
au moment de l'exécution, la console de débogage imprimera Optional("foobar")
. La Optional()
partie " " indique que cette variable peut ou non avoir une valeur au moment de l'exécution, mais se trouve justement qu'elle contient actuellement la chaîne "foobar". Cette Optional()
indication " " restera à moins que vous ne fassiez ce qu'on appelle "déballer" la valeur facultative.
Déballer une option signifie que vous convertissez maintenant ce type comme non facultatif. Cela générera un nouveau type et attribuera la valeur qui résidait dans ce type facultatif au nouveau type non facultatif. De cette façon, vous pouvez effectuer des opérations sur cette variable car elle a été garantie par le compilateur pour avoir une valeur solide.
Conditionally Unwrapping vérifiera si la valeur de l'option est nil
ou non. Si ce n'est pas le cas nil
, il y aura une variable constante nouvellement créée à laquelle la valeur sera attribuée et déroulée dans la constante non facultative. Et à partir de là, vous pouvez utiliser en toute sécurité le non-facultatif dans le if
bloc.
Remarque: Vous pouvez donner à votre constante déballée conditionnellement le même nom que la variable facultative que vous déballez.
if let myString = myString {
print(myString)
// will print "foobar"
}
Le déballage conditionnel des options est le moyen le plus propre d'accéder à la valeur d'un optionnel car s'il contient une valeur nulle, tout ce qui se trouve dans le bloc if let ne s'exécutera pas. Bien sûr, comme toute instruction if, vous pouvez inclure un bloc else
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
Le déballage forcé est effectué en utilisant ce que l'on appelle l' !
opérateur ("bang"). Ceci est moins sûr mais permet toujours à votre code de se compiler. Cependant, chaque fois que vous utilisez l'opérateur bang, vous devez être sûr à 1000% que votre variable contient en fait une valeur solide avant de forcer le déballage.
var myString: String?
myString = "foobar"
print(myString!)
Ce ci-dessus est un code Swift entièrement valide. Il imprime la valeur de myString
qui a été définie comme "foobar". L'utilisateur verrait foobar
imprimé dans la console et c'est à peu près tout. Mais supposons que la valeur n'a jamais été définie:
var myString: String?
print(myString!)
Maintenant, nous avons une situation différente entre nos mains. Contrairement à Objective-C, chaque fois qu'une tentative est faite pour déballer de force un optionnel, et que le optionnel n'a pas été défini et l'est nil
, lorsque vous essayez de déplier le optionnel pour voir ce qu'il y a à l'intérieur de votre application se bloque.
Déballage avec moulage de type . Comme nous l'avons dit précédemment, bien que vous soyez unwrapping
le type facultatif, vous convertissez en un type non facultatif, vous pouvez également convertir le type non facultatif en un type différent. Par exemple:
var something: Any?
Quelque part dans notre code, la variable something
sera définie avec une valeur. Peut-être utilisons-nous des génériques ou peut-être y a-t-il une autre logique qui changera la situation. Donc, plus tard dans notre code, nous voulons l'utiliser something
mais toujours pouvoir le traiter différemment s'il s'agit d'un type différent. Dans ce cas, vous voudrez utiliser le as
mot - clé pour déterminer ceci:
Remarque: L' as
opérateur est la façon dont vous tapez cast dans Swift.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Notez la différence entre les deux as
mots-clés. Comme avant, lorsque nous avons déballé de force un optionnel, nous avons utilisé l' !
opérateur bang pour le faire. Ici, vous ferez la même chose, mais au lieu de diffuser comme un simple non-facultatif, vous le diffusez également en tant que Int
. Et il doit pouvoir être abattu car Int
, sinon, comme utiliser l'opérateur bang lorsque la valeur est, nil
votre application plantera.
Et pour pouvoir utiliser ces variables dans une sorte ou une opération mathématique, elles doivent être déballées pour ce faire.
Par exemple, dans Swift, seuls les types de données numériques valides du même type peuvent être exploités les uns sur les autres. Lorsque vous transtypez un type avec le, as!
vous forcez le downcast de cette variable comme si vous étiez certain qu'elle est de ce type, donc sans danger pour fonctionner et ne pas planter votre application. Ce n'est pas grave tant que la variable est effectivement du type vers lequel vous la lancez, sinon vous aurez un désordre entre les mains.
Néanmoins, le cast avec as!
permettra à votre code de se compiler. En castant avec un as?
c'est une autre histoire. En fait, as?
déclare votre Int
comme un type de données complètement différent.
C'est maintenant Optional(0)
Et si vous avez déjà essayé de faire vos devoirs en écrivant quelque chose comme
1 + Optional(1) = 2
Votre professeur de mathématiques vous aurait probablement donné un «F». Même chose avec Swift. Sauf que Swift préfère ne pas compiler du tout plutôt que de vous donner une note. Parce qu'en fin de compte, le optionnel peut en fait être nul .
La sécurité d'abord pour les enfants.