as
utilisé pour la projection ascendante et le moulage de type en type ponté
as?
utilisé pour un casting sécurisé, retourne zéro en cas d'échec
as!
utilisé pour forcer le casting, crash en cas d'échec
Remarque:
as!
impossible de convertir le type brut en facultatif
Exemples:
let rawString: AnyObject = "I love swift"
let optionalString: AnyObject? = "we love swift"
let nilString: AnyObject? = (nil as String?)
let rawInt: AnyObject = Int(3)
let optionalInt: AnyObject? = Int(3)
let nilInt: AnyObject? = (nil as Int?)
Exemple
var age: Int? = nil
var height: Int? = 180
En ajoutant un ? immédiatement après le type de données, vous indiquez au compilateur que la variable peut contenir un nombre ou non. Soigné! Notez que cela n'a pas vraiment de sens de définir des constantes optionnelles - vous ne pouvez définir leur valeur qu'une seule fois et vous pourrez donc dire si leur valeur sera nulle ou non.
Quand devrions-nous utiliser "?" et quand "!"
disons que nous avons une application simple basée sur UIKit. nous avons du code dans notre contrôleur de vue et souhaitons y présenter un nouveau contrôleur de vue. et nous devons décider de pousser la nouvelle vue à l'écran à l'aide du contrôleur de navigation.
Comme nous le savons, chaque instance de ViewController possède un contrôleur de navigation de propriété. Si vous créez une application basée sur un contrôleur de navigation, cette propriété du contrôleur de vue principale de votre application est définie automatiquement et vous pouvez l'utiliser pour pousser ou afficher des contrôleurs de vue. Si vous utilisez un seul modèle de projet d'application, il n'y aura pas de contrôleur de navigation créé automatiquement pour vous, donc le contrôleur de vue par défaut de votre application n'aura rien stocké dans la propriété navigationController.
Je suis sûr que vous avez déjà deviné qu'il s'agit exactement d'un cas pour un type de données facultatif. Si vous cochez UIViewController, vous verrez que la propriété est définie comme:
var navigationController: UINavigationController? { get }
Revenons donc à notre cas d'utilisation. Si vous savez avec certitude que votre contrôleur de vue aura toujours un contrôleur de navigation, vous pouvez continuer et forcer le déballage:
controller.navigationController!.pushViewController(myViewController, animated: true)
Lorsque vous mettez un! derrière le nom de la propriété, vous dites au compilateur que je me fiche que cette propriété soit facultative, je sais que lorsque ce code s'exécute, il y aura toujours un magasin de valeurs, alors traitez cette option comme un type de données normal. N'est-ce pas sympa? Que se passerait-il s'il n'y avait pas de contrôleur de navigation pour votre contrôleur de vue? Si vous suggérez qu'il y aura toujours une valeur stockée dans navigationController était faux? Votre application va planter. Simple et moche comme ça.
Alors, utilisez! seulement si vous êtes sûr à 101% que c'est sûr.
Et si vous n'êtes pas sûr qu'il y aura toujours un contrôleur de navigation? Ensuite, vous pouvez utiliser? à la place d'un !:
controller.navigationController?.pushViewController(myViewController, animated: true)
Qu'est-ce que c'est? derrière le nom de la propriété indique au compilateur que je ne sais pas si cette propriété contient nil ou une valeur, donc: si elle a une valeur, utilisez-la, et sinon considérez simplement l'expression entière comme nulle. Effectivement le? vous permet d'utiliser cette propriété juste au cas où il y aurait un contrôleur de navigation. Non s'il s'agit de chèques de toute nature ou de pièces moulées de toute sorte. Cette syntaxe est parfaite lorsque vous ne vous souciez pas de savoir si vous avez un contrôleur de navigation ou non, et que vous ne voulez faire quelque chose que s'il y en a.
Un grand merci à Fantageek