带有Void的泛型类型在Swift 4中提供了错误缺失参数

Cen*_*nny 3 generics closures void swift swift4

当我尝试迁移到Swift 4时,如果你将Void作为输入,我的通用类型的闭包发生了错误.这在Swift 3中运行良好,但现在没有那么多,任何人都知道为什么,这是一个bug还是一个功能?

通过违反显式处理此案例的另一个闭包,有一种解决方法.但是很高兴不必使用这种解决方法并理解为什么在Swift 4中出现此错误.

typealias Handler<T> = (T) -> Void

func foo(completion: Handler<String>) {
    completion("fooing")
}

// This worked in Swift 3, but not in Swift 4
func bar(completion: Handler<Void>) {
    completion() // Missing argument for parameter #1 in call
}
Run Code Online (Sandbox Code Playgroud)

Cen*_*nny 7

看来这不是一个bug,而是Swift现在的工作方式.您不能再省略类型的关联值Void.

我找到了两个可通过的解决方法:

第一个只是明确地传递了值.

func bar(completion: Handler<Void>) {
    completion(())
}
Run Code Online (Sandbox Code Playgroud)

第二种解决方案是为void case声明另一个typealias.

typealias VoidHandler = () -> Void

func barbar(completion: VoidHandler) {
    completion()
}
Run Code Online (Sandbox Code Playgroud)