Passer options dans Swift: comme? Type, ou en tant que! Type de?
Le suivant dans Swift:
var optionalString: String?
let dict = NSDictionary()
Quelle est la différence pratique entre les deux énoncés suivants:
optionalString = dict.objectForKey("SomeKey") as? String
vs
optionalString = dict.objectForKey("SomeKey") as! String?
- Aussi, Voir Le tant que! Opérateur d'Apple
Vous devez vous connecter pour publier un commentaire.
La pratique, la différence est: est-ce
optionalString
sera une variable de typeString?
. Si le type sous-jacent est autre chose qu'unString
ce sans danger suffit d'attribuernil
à l'option.Cela dit, je savoir, cette chose est un
String?
. Ce sera également le résultat dansoptionalString
être de typeString?
, mais il va planter si le type sous-jacent, c'est autre chose.Le premier style est ensuite utilisé avec
if let
en toute sécurité déballer l'option:as? Types
- signifie que le bas du procédé de coulée est facultatif. Le processus peut être réussie ou non(système retourne nil si bas de la coulée échoue).De toute façon ne va pas planter si bas de la coulée échoue.as! Type?
- Ici le processus de baisse de la coulée doit être réussie (!
indique que) . La fin de point d'interrogation indique si le résultat final peut être nul ou pas.Plus d'infos concernant les "!" et "?"
Prenons 2 cas
Considérer:
Ici, nous ne savons pas si le résultat de la baisse de la coulée de la cellule avec l'identifiant de la "Cellule" de UITableViewCell est un succès ou pas. En cas d'échec, puis il retourne nil( afin d'éviter un crash ici). Ici, nous pouvons faire en tant que donnée ci-dessous.
Laissez-nous donc en souviens comme si c' - Si
?
cela signifie que nous ne sommes pas sûr de savoir si la valeur est nulle ou non (point d'interrogation vient quand nous ne savons pas les choses).Contraste que:
Ici nous dire au compilateur que le bas de la coulée doit être réussie. Si elle échoue, le système se bloque. Nous donnons donc
!
lorsque nous sommes sûrs que la valeur est non nulle.De clarifier ce que vacawama dit, voici un exemple...
Swift 3.0:
Swift 2.0:
intNil as! String? // ==nil
ne pas causer un accident!!!???, comme Option<Int>.Aucun est différent de l'Option<String>.Aucunas?
àString
? Pourquoi ne pas vous abattu àString?
? Pourquoi n'avez-vous pas abattuas!
àString
?Any
au lieu deAnyObject
Ils sont deux formes différentes de de Passer en Swift.
(
as?
), qui est connu pour être la Conditionnelle, renvoie une valeur optionnelle de type que vous essayez d'baissés pour.(
as!
), qui est connu pour être la Forcé Forme, les tentatives de la baissés et la force déballe le résultat comme une simple action composé.Pour plus de détails, veuillez consulter La Conversion De Type section de la documentation d'Apple.
as
utilisé pour upcasting et le type coulée de ponté typeas?
utilisé pour la sécurité de la coulée, de retour néant en cas d'échec de laas!
utilisé pour forcer le casting, crash en cas d'échec deRemarque:
as!
ne pouvez pas jeter raw type facultatifExemples:
Exemple
Par l'ajout d'un ? immédiatement après le type de données que vous dire au compilateur que la variable peut contenir un nombre ou pas. Neat! Notez qu'il n'est pas vraiment à définir en Option constantes – vous pouvez définir leur valeur qu'une seule fois et, par conséquent, vous seriez en mesure de dire si leur valeur est nulle ou pas.
Quand on doit utiliser "?" et quand "!"
disons que nous avons UIKit base simple application.
nous avons un peu de code dans notre point de vue, contrôleur et veut présenter un nouveau point de vue contrôleur sur le dessus de cela.
et nous avons besoin de décider de pousser le nouveau point de vue sur l'écran au moyen de la manette de navigation.
Comme nous le savons tous ViewController exemple, a une propriété manette de navigation.
Si vous êtes à la construction d'une manette de navigation application basée sur cette propriété de votre application maître-vue-contrôleur est réglé automatiquement et vous pouvez l'utiliser pour pousser ou de pop affichage des contrôleurs. Si vous utilisez un seul modèle de projet d'application – il n'y aura pas une manette de navigation créé automatiquement pour vous, de sorte que votre application par défaut de-vue-contrôleur n'aura pas tout ce qui est stocké dans le navigationController propriété.
Je suis sûr que vous avez déjà deviné que c'est exactement le cas pour une Option de type de données. Si vous cochez UIViewController, vous verrez que la propriété est définie comme:
Donc, revenons à notre cas d'utilisation. Si vous savez pour un fait que votre vue-contrôleur aura toujours une manette de navigation, vous pouvez aller de l'avant et de la force de déballer:
Lorsque vous mettez un ! derrière le nom de la propriété vous dire au compilateur je ne se soucie pas que cette propriété est facultative, je sais que quand ce code s'exécute, il y aura toujours une valeur magasin afin de traiter cette Option comme un normal type de données. Bien n'est-ce pas agréable? Qu'arriverait-il si il n'y a pas une manette de navigation à votre vue-contrôleur? Si vous avez une suggestion qu'il sera toujours une valeur stockée dans navigationController était le problème? Votre application va se planter. Simple et moche que ça.
Diriez-vous si vous n'êtes pas sûr qu'il y aura toujours une manette de navigation? Vous pouvez ensuite utiliser ? au lieu d'un !:
Ce que l' ? derrière le nom de la propriété indique au compilateur est je ne sais pas si cette propriété contient zéro ou une valeur, donc: si elle a une valeur de l'utiliser, et oterwise il suffit de considérer l'ensemble de l'expression du néant. Effectivement l' ? vous permet d'utiliser cette propriété dans le cas où il y a une manette de navigation. Aucun, si des contrôles de toute nature ou de coulées de toute sorte. Cette syntaxe est parfaite si vous n'avez pas de soins si vous avez une manette de navigation ou pas, et qui veulent faire quelque chose seulement si il existe.
Grand merci à Fantageek
Peut-être cet exemple de code pour aider quelqu'un en connaît le principe:
Le premier est un "conditionnel cast" (voir sous "type de casting opérateurs" dans la documentation que j'ai mis en lien). Si le sort réussit, la valeur de l'expression est enveloppé dans une option et est retourné, sinon, la valeur retournée est nul.
La seconde signifie que optionalString pourrait être un objet de type string ou il pourrait être nul.
Plus d'informations trouvées dans cette question.
Il peut être plus facile de se rappeler le modèle de ces opérateurs rapide comme:
!
implique "cela pourrait piège", alors que?
indique "ce pourrait être nul."se référer à:
https://developer.apple.com/swift/blog/?id=23
Je suis novice de Swift et de l'écriture de cet exemple pour essayer d'expliquer ce que je comprends sur 'options'. Si je me trompe merci de me corriger.
Grâce.
(1) :
obj.lastName = obj.lName as! String
vs
(2) :
obj.lastName = obj.lName as? String
Réponse : (1) Ici, le programmeur est damm assurer que
“obj.lName”
contient la chaîne de type objet. Donc, juste donner de la valeur à“obj.lastName”
.Maintenant, si le programmeur est correct signifie
"obj.lName"
est de type string (chaîne de l'objet, alors pas de problème. "obj.lastName" sera réglé à la même valeur.Mais si le programmeur est de mauvais moyens
"obj.lName"
est pas de type chaîne de caractères de l'objet c'est à dire qu'il contient un autre type d'objet comme "NSNumber" etc. Puis CRASH (Erreur d'Exécution).(2) - Programmeur n'est pas sûr que
“obj.lName”
contient la chaîne de type objet ou tout autre type d'objet. Afin de définir cette valeur à“obj.lastName”
si elle est de type chaîne.Maintenant, si le programmeur est correct signifie
“obj.lName”
est de type string (chaîne de l'objet, alors pas de problème.“obj.lastName”
sera réglé à la même valeur.Mais si le programmeur est de mauvais moyens obj.lName est pas de type chaîne de caractères de l'objet c'est à dire qu'il contient un autre type d'objet comme
"NSNumber"
etc. Puis“obj.lastName”
sera mis à la valeur nil. Donc, Pas De Plantage (Heureux:)