J'ai commencé à utiliser Result comme type de retour et je l'aime surtout, mais quand je n'ai rien à retourner pour réussir, je ne sais pas quoi faire dans cette déclaration de cas. Des conseils?
Tout ce à quoi je pouvais penser était let _ = 0
func createAppDirectory(_ searchPath: FileManager.SearchPathDirectory) -> Result<Void,Error>
...
switch createAppDirectory(searchPath) {
case .success(_): let _ = 0
case .failure(let error): return .failure(error)
}
Je commence à penser que peut-être que Result ne l'est pas un bon ajustement lorsque le type de succès est Void.
BTW createAppDirectory crée simplement Library / Application Support / . Il n'y a aucune valeur à renvoyer en cas de succès.
4 Réponses :
Utilisez une instruction break:
switch createAppDirectory(searchPath) {
case .success:
break
case .failure(let error): return .failure(error)
}
Comme l'a souligné Mojtaba, si vous n'utilisez pas la valeur associée pour un cas particulier de votre enum, vous pouvez simplement l'ignorer. J'ai modifié ma réponse ci-dessus pour supprimer le (_) du cas .success
Et il n'y a rien de mal à ajouter un commentaire comme / * ne rien faire * / pour rendre l'intention claire.
Vous pouvez également vous débarrasser de ce trait de soulignement.
Il suffit de l'ignorer:
guard case .failure(let error) = createAppDirectory(searchPath) else { return <#Value#> }
Aussi si vous ne voulez absolument pas de surmenage quand ce n'est pas un cas d'échec, gaurd au tout début de la portée:
case .success: break
Vous dites "ignorez-le simplement", mais la façon de l'ignorer est d'utiliser une instruction break, tout comme vous l'avez fait pour votre réponse. La réponse est d'utiliser break plutôt qu'une instruction factice comme let _ = 0 .
Je voulais dire ignorer le cas de réussite .
D'accord, mais tout l'intérêt de la question des OP était qu'il ne pouvait pas comprendre comment obtenir un cas vide à compiler sans un let _ = 0 jetable. La pause est la façon dont vous faites la compilation du cas .success ne rien faire.
Renvoie un résultat vide simple,
switch createAppDirectory(searchPath) {
case .success: return .success(())
case .failure(let error): return .failure(error)
}
Si seule l'erreur est significative, Le résultat est inapproprié.
Un meilleur modèle consiste à lancer l'erreur et ne rien renvoyer
do {
try createAppDirectory(searchPath)
} catch { print(error)}
Il est généralement préférable de lancer la fonction plutôt que de renvoyer un
Résultatquand il est synchroneVous pouvez également essentiellement le convertir en une fonction de lancement sur le site d'appel en l'appelant comme
try createAppDirectory (searchPath) .get ()@MichealSalmon En ce qui concerne la conception d'API, ne serait-il pas plus utile de renvoyer le chemin?
let path = createAppDirectory (.userDirectory) .get ()(ou gérez leRésultatd'une autre manière, à côté de.get ()J'utilise .applicationSupportDirectory mais cela ne change vraiment rien. Si quoi que ce soit, je changerais la fonction pour qu'elle accepte une URL de fichier et crée le répertoire contenant ce fichier si nécessaire. Le retour du chemin du répertoire ressemble plus à un effet secondaire. C'est une question de goût je suppose.