由于Swift中typealias
定义缺乏通用支持,我写了一个通用的ResultHandler<T>
回调,如下所示:
struct ResultHandler<T> {
let f: (result: T) -> ()
}
这适用于使用Void
以外的任何其他内容的处理程序:
Dispatch<Bool>.dispatch({ () -> (Result<Bool>) in
Result<Bool>(true)
}).onResult(ResultHandler() { (result: Bool) in
if result {
self.doSomething() // Method executes successfully
}
})
但是在尝试使用Void
:
Dispatch<Void>.dispatch({ () -> (Result<Void>) in
Result<Void>()
}).onResult(ResultHandler() { (result: Void) in // Compiler error here
self.doSomething()
})
存在编译错误:
功能签名&#39;(虚空) - &gt; ()&#39;与预期类型不兼容 &#39;(结果:无效) - &gt; ()&#39;
似乎误导/编译器错误,好像我更改了签名以使用错误输入的值:
Dispatch<Void>.dispatch({ () -> (Result<Void>) in
Result<Void>()
}).onResult(ResultHandler() { (result: Void?) in // Compiler error here
self.doSomething()
})
错误消息会选择指示?
的可选项,但仍无法正确检测到我的result:
标签:
功能签名&#39;(空?) - &gt; ()&#39;与预期类型不兼容 &#39;(结果:无效) - &gt; ()&#39;
我做错了什么?
答案 0 :(得分:1)
您不需要在闭包类型声明中指定参数名称 - 这是导致编译器出现问题的原因:
struct ResultHandler<T> {
let f: T -> ()
}
现在,您可以创建使用ResultHandler
参数,Bool
参数的Void
个实例,或完全省略参数:
let r1 = ResultHandler() { (result: Bool) in
if result {
// do something
}
}
let r2 = ResultHandler() { (_: Void) in
// do something
}
let r3 = ResultHandler() {
// do something
}