2017-07-27 4 views
2

Est-il possible d'utiliser un chaînage optionnel et une coalescence nulle simultanément? Je voudrais faire cela mais je reçois une erreur en disant que mon String? n'est pas déballé. email est une chaîne non facultative.Puis-je utiliser le chaînage optionnel pour donner une valeur par défaut pour la propriété d'un optionnel?

Est-ce possible sans avoir à déballer host avant main et sinon pourquoi ma tentative de faire cela ne fonctionne pas?

+1

Si vous obtenez une erreur de compilation "inattendue", divisez l'expression en parties plus petites. Dans votre cas: Commencer par 'let host = meeting.host?.email ?? "Aucun hôte"; print ("Meeting host:" + host) '- Vous remarquerez que cela compile, donc le chaînage optionnel et le coalescing nil fonctionnent généralement. –

+1

Voir ici, https://stackoverflow.com/a/44877393/6479530 –

Répondre

3

Vous n'avez pas besoin de le déballer pour le faire fonctionner. Ce n'est pas pourquoi l'erreur s'est produite. Le ?? est conçu pour gérer de tels cas, après tout.

L'erreur se produit en raison de la priorité de l'opérateur. Le compilateur pense qu'il devrait d'abord évaluer le +, en concaténant les deux chaînes, PUIS faire le nul-coalescent. Il voit que le deuxième opérande n'est pas déballé et se plaint.

Pour faire produire le résultat escompté, indiquer explicitement au compilateur d'évaluer la ?? d'abord par des crochets en ajoutant:

print("Meeting host: " + (meeting.host?.email ?? “No host”)) 
+1

Notez que l'utilisation de '+' de cette façon peut faire exploser les temps de compilation. Évitez fortement «+» avec des chaînes; c'est la cause # 1 de "mon Swift prend trop de temps à compiler" des questions. On est bien, mais même deux ou trois conduisent à des problèmes exponentiels. Prenez l'habitude de l'interpolation de chaîne: 'print (" Meeting host: \ (meeting.host?.email ?? "No host") ")' Cela arrive également pour se débarrasser du problème de précédence Sweeper explique si bien. –

+2

print() prend un nombre variable d'arguments, donc on peut aussi écrire 'print (" Meeting host: ", meeting.host?.email ??" No host ")' –

1

Il existe une solution plus facile pour cela:

class Host { 
    var email: String? 
} 

var host: Host? = nil 
print("Meeting host: " + String(describing: host?.email)) 

La sortie est :

hôte de la réunion: néant

+1

Cela ne fait pas la même chose. 'host' est un optionnel donc' host.email' ne compilerait pas. –

+0

Je vais mettre à jour ma réponse, pour montrer quel était mon test. –

+0

Mais pour une valeur non nulle cela affichera 'Meeting host: Optional (Bob)' ou quelque chose comme ça, non? –