J'essaye avec ces lignes de code
class Student {
var name: String
var age: Int?
init(name: String) {
self.name = name
}
func description() -> String {
return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
}
}
var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())
Le code ci-dessus produit comme suit
Daniel hides his age.
Daniel is Optional(18) years old.
Ma question est de savoir pourquoi il y a facultatif (18) là-bas, comment puis-je supprimer l'option facultative et juste l'impression
Daniel is 18 years old.
if let age = age { return ""} else { return "" }
Many Swift beginners think var age: Int? means that age is an Int which may or may not have a value. But it means that age is an Optional which may or may not hold an Int.
Un optionnel signifie que Swift n'est pas entièrement sûr si la valeur correspond au type: par exemple, Int? signifie que Swift n'est pas entièrement sûr que le nombre soit un Int.
1) Si vous êtes absolument sûr du type, vous pouvez utiliser un point d'exclamation pour forcer le déballage, comme ceci:
Si vous forcez le déballage d'un optionnel et qu'il est égal à nil, vous pouvez rencontrer cette erreur de plantage:
Ce n'est pas forcément sûr, alors voici une méthode qui pourrait éviter de planter si vous n'êtes pas certain du type et de la valeur:
2) Le facultatif implicitement non emballé
3) La déclaration de garde
De là, vous pouvez continuer et utiliser la variable non emballée. Assurez-vous de ne forcer le dépliage (avec un!) Que si vous êtes sûr du type de la variable.
la source
À des fins de test / débogage, je souhaite souvent afficher des options sous forme de chaînes sans toujours avoir à tester les
nil
valeurs, j'ai donc créé un opérateur personnalisé.J'ai encore amélioré les choses après avoir lu cette réponse dans une autre question .
Évidemment, l'opérateur (et ses attributs) peut être modifié à votre guise, ou vous pouvez en faire une fonction à la place. Quoi qu'il en soit, cela vous permet d'écrire du code simple comme celui-ci:
L'intégration de l'idée de protocole de l'autre gars a fait en sorte que cela fonctionne même avec des options imbriquées, qui se produisent souvent lors de l'utilisation du chaînage facultatif. Par exemple:
la source
String
autre endroit (par exemple un journal / message d'erreur).Mettre à jour
Utilisez simplement
me.age ?? "Unknown age!"
. Cela fonctionne en 3.0.2.Ancienne réponse
Sans déballage forcé (pas de signal mach / crash si nul), une autre bonne façon de faire cela serait:
(result["ip"] ?? "unavailable").description
.result["ip"] ?? "unavailable"
devrait avoir du travail aussi, mais ce n'est pas le cas, pas en 2.2 du moinsBien sûr, remplacez "indisponible" par ce qui vous convient: "nil", "not found" etc
la source
Pour déballer une utilisation facultative à la
age!
place deage
. Actuellement, vous imprimez une valeur facultative qui pourrait êtrenil
. C'est pourquoi il s'est emballé avecOptional
.la source
Dans swift
Optional
est quelque chose qui peut êtrenil
dans certains cas. Si vous êtes sûr à 100% que avariable
aura toujours une valeur et ne retournera pasnil
l'addition!
avec la variable pour forcer le déroulement.Dans les autres cas, si vous n'êtes pas très sûr de la valeur, ajoutez un
if let
bloc ouguard
pour vous assurer que cette valeur existe, sinon cela peut entraîner un plantage.Pour
if let
bloc:Pour
guard
déclaration:guard
est une structure conditionnelle pour retourner le contrôle si la condition n'est pas remplie.Je préfère utiliser
guard
overif let
block dans de nombreuses situations car cela nous permet de renvoyer lefunction
si une valeur particulière n'existe pas. Comme quand il y a une fonction où une variable est intégrale pour exister, nous pouvons la vérifier dans une déclaration de garde et le retour de celle-ci n'existe pas. c'est à dire;Si la variable existe, nous pouvons utiliser 'abc' dans la fonction en dehors de la portée de garde.
la source
age
est un type optionnel:Optional<Int>
donc si vous le comparez à nil, il retourne false à chaque fois s'il a une valeur ou si ce n'est pas le cas. Vous devez dérouler l'option facultative pour obtenir la valeur.Dans votre exemple, vous ne savez pas s'il contient une valeur, vous pouvez donc l'utiliser à la place:
la source
J'ai fait cela pour imprimer la valeur de la chaîne (propriété) à partir d'un autre contrôleur de vue.
ViewController.swift
SecondViewController.swift
Résultat :
la source
Consultez la
guard
déclaration:la source
Lorsque vous avez une valeur par défaut:
print("\(name) is \(age ?? 0) years old")
ou lorsque le nom est facultatif:
print("\(name ?? "unknown") is \(age) years old")
la source
J'obtenais l'option facultative ("chaîne") dans mes cellules de tableview.
La première réponse est excellente. Et m'a aidé à comprendre. Voici ce que j'ai fait, pour aider les recrues comme moi.
Puisque je crée un tableau dans mon objet personnalisé, je sais qu'il aura toujours des éléments en première position, donc je peux forcer le déplier dans une autre variable. Ensuite, utilisez cette variable pour imprimer, ou dans mon cas, définissez le texte de la cellule tableview.
Cela semble si simple maintenant, mais il m'a fallu un certain temps pour comprendre.
la source
Ce n'est pas la réponse exacte à cette question, mais une des raisons de ce genre de problème. Dans mon cas, je n'ai pas pu supprimer Optional d'une chaîne avec "if let" et "guard let".
Utilisez donc AnyObject au lieu de Any pour supprimer facultatif d'une chaîne dans swift.
Veuillez consulter le lien pour la réponse.
https://stackoverflow.com/a/51356716/8334818
la source