2017-09-01 32 views
0
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>) ->()'

回答

2

您是否尝试过这种方式?

typealias BaseFunc<B:A> = (Result<B>) ->() 

typealias没有一个泛型参数

+0

你是绝对正确的。但是,当我试图在我的更具体的例子中遵循你的建议时,它仍然失败。 协议A {} 扩展INT:A {} 扩展字符串:A {} 枚举结果 { 情况下成功(T) 情况误差(错误) } typealias BaseFunc =(结果) - >() FUNC FOO(R:结果){} FUNC巴(R:结果){} 变种F:BaseFunc 如果arc4random_uniform(10)<5 { F = FOO } else { f = bar } –

+0

@SergeRykovski您可以告诉我们您想在设置VAR F后使用的方式吗? – iWheelBuy