2017-07-15 211 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 
    } 
}