2017-07-15 170 views
0

我有这样的功能的结构:泛型返回问类型

func someFunction<T: Codable>(x: Double, y: Double, outputClass: T, completionBlock: CompletionBlock) 

的completionblock是:

enum Result { 
    case success(Codable) 
    case failure(String?) 
} 

typealias CompletionBlock = (Result) -> Void 

我想实现的是,当你调用函数例如像这样:

someFunction(x: 12, y: 12, outputClass: Foo.self) { (result) in 
    switch result { 
    case .success(let result): 
} 

我让成功案例的结果是类型Foo。

我有一个Foo结构:

struct Foo: Codable { 
    let content: String 
} 

现在,当我尝试调用函数的Xcode告诉我:

Argument type 'Foo.Type' does not conform to expected type 'Encodable' 

但结构符合类型可编码的,这是可编码&解码。

有人可以解释我做错了什么吗?

+0

您传递的是Type的实例,而不是符合'Codable'的对象的实例。 – Paulw11

回答

0

我认为你需要将你的函数包装在一个泛型类中,并将enum放入类中。这样,您可以使用该类的通用参数T而不是该函数中的T。您也不需要outputType参数。

class SomeClass<T: Codeable> { 
    class func someFunction(x: Double, y: Double, completionBlock: CompletionBlock) { 

    } 

    enum Result { 
     case success(T) 
     case failure(String?) 
    } 

    typealias CompletionBlock = (Result) -> Void 
} 

struct Foo: Codeable { 

} 

// usage 
SomeClass<Foo>.someFunction(x: 0, y: 0) { (x) in 
    switch x { 
    case .success(let result): 
     // result is now of type Foo 
    case .failure: 
     break 
    } 
}