Dans Swift 4, un cas d'enum avec un élément de type Void
n'est plus équivalent à un cas d'énumération avec une liste vide de valeurs associées.
Je crois que c'est ça, comme le dit Martin à la suite de SE-0029 où il n'est plus possible de passer un n-uplet d'arguments à une fonction et de les faire "éclater" parmi les paramètres (bien que cette proposition ait été marquée dans Swift 3, je crois que ce cas particulier a été repris plus tard dans l'implémentation de la fonction SE-0110 pour Swift 4).
En conséquence, cela signifie que vous ne pouvez plus appeler une (Void) -> T
en tant que () -> T
dans Swift 4. Vous devez maintenant passer Void
de manière explicite :
let result = Result.success(())
Cependant, je trouve cela assez laid, donc j'implémente généralement une extension comme celle-ci :
extension Result where Success == Void {
static var success: Result {
return .success(())
}
}
Ce qui vous permet de dire des choses comme ça :
var result = Result.success
result = .success
Il convient de noter que cette solution de contournement n'est pas seulement limitée aux cas d'enum, elle peut également être utilisée avec les méthodes en général. Par exemple :
struct Foo<T> {
func bar(_ a: T) {}
}
extension Foo where T == Void {
func bar() { bar(()) }
}
let f = Foo<Void>()
// without extension:
f.bar(())
// with extension:
f.bar()
0 votes
Vous êtes sûr de la deuxième méthode ? Il semble qu'elle fonctionne. swift.sandbox.bluemix.net/#/repl/599d61b1b459cc41aee76d9d
0 votes
Intéressant, merci pour l'exemple. J'ai revérifié, mais dans Xcode 9 Beta 5 j'obtiens
Missing argument for parameter #1 in call
.0 votes
@Hamish : Vous avez probablement raison (j'étais encore à SE-0110 et SE-0029 ... :)
1 votes
@Hamish : Cela pourrait aussi être une conséquence de SE-0029 : Le "constructeur"
let f = Result<Void>.success
a le type(Void) -> Result<Void>
dans Swift 3 et 4b5. En Swift 3, vous pouvez appelerlet r = f()
dans 4b5 vous devez ajouter un argument :let r = f(())