protocol A {}
extension Int: A {}
extension String: A {}
enum Result<T> {
case success(T)
case error(Error)
}
typealias BaseFunc = (Result<A>) ->()
func foo(r: Result<Int>) {}
func bar(r: Result<String>) {}
var f: BaseFunc = foo
编译器参数的参数说cannot convert value of type '(Result<Int>) ->()' to specified type 'BaseFunc' (aka '(Result<A>) ->()')
斯威夫特通用枚举为逃避闭包是功能
是什么,我想在斯威夫特做可能吗?也许有另外一种方法可以达到类似的结果?
@iWheelBuy对此问题正确回答。但是我认为它是错误的。我想是这样的:
protocol A {}
extension Int: A {}
extension String: A {}
enum Result<T> {
case success(T)
case error(Error)
}
typealias BaseFunc<T> = (Result<T>) ->()
func foo(r: Result<Int>) {}
func bar(r: Result<String>) {}
var f: BaseFunc<A>
if arc4random_uniform(10) < 5 {
f = foo
} else {
f = bar
}
导致:cannot assign value of type '(Result<Int>) ->()' to type '(Result<A>) ->()'
一个'(结果) - > Void'不是'(结果) - > Void'。说你的代码符合;我可以说'f(.success(“foobar”))'。我们只是通过一个'String'来期望一个'Int'。但是在任何情况下,[泛型都是不变的](https://stackoverflow.com/q/41976844/2976878),所以反过来也是非法的(但由于'Result'的值语义在技术上是合理的)。 –
Hamish