Swift泛型func调用泛型func

Swift泛型func调用泛型func,swift,generics,swift4,Swift,Generics,Swift4,当使用一个泛型调用另一个泛型时,我有一个有趣的编译错误。这篇文章有点长,但希望不会超过描述问题所需的时间 我已经定义了一个通用func,它非常有效。我经常使用它,而且使用模式通常是相同的。我试图实现一个新的泛型func,它嵌套了现有的泛型func,但是我得到了一个编译时错误 在某些上下文中,下面是我的API现在如何使用泛型的。我的REST API调用films()func,点击StarWarsAPI(swapi.co)并返回数据库中所有星球大战电影的列表,如下所示: StarWarsAPI.sh

当使用一个泛型调用另一个泛型时,我有一个有趣的编译错误。这篇文章有点长,但希望不会超过描述问题所需的时间

我已经定义了一个通用func,它非常有效。我经常使用它,而且使用模式通常是相同的。我试图实现一个新的泛型func,它嵌套了现有的泛型func,但是我得到了一个编译时错误

在某些上下文中,下面是我的API现在如何使用泛型的。我的REST API调用films()func,点击StarWarsAPI(swapi.co)并返回数据库中所有星球大战电影的列表,如下所示:

StarWarsAPI.shared.films(){ (films, error) in
       for film in films {
                print(film.title)
       }  
 }
public class Result {
    var urlPath:URL?
}
public class FilmResult: Result, Codable {

    var count:Int?
    var next:String?
    var previous:String?
    var results:[Film]?

}
films()函数调用一个通用函数(restCall()),该函数非常有效。以下是电影的定义()

其中restCall(泛型)的定义如下:(注意,我使用的是swift4可编码API)

我得到的错误显示在下面的屏幕截图中-希望是清楚的

如果您能提供任何帮助,我们将不胜感激

您的电话必须是

                       this was T previously  ───┐
restCall(fetchUrl: result.urlPath!, modelType: result) { (finalResults, error ) in
注意
结果
,而不是
T


要复制的相对最少的代码:

public func restCall<T>(fetchUrl: URL, modelType: T, completion: @escaping (_ modelObject: T?, _ error:String?) -> Void) { }

public func fetchAll<T>(result:T,  completionAll:  @escaping (_ result:T?, _ error:String?) -> Void) {

                                                          ┌── should be result   
    restCall(fetchUrl: URL(string: "asdasd")!, modelType: T) { (finalResults, error ) in
        completionAll(finalResults, error)
    }
}
public func restCall(fetchUrl:URL,modelType:T,completion:@escaping(\umodelobject:T?,\uerror:String?)->Void){
public func fetchAll(结果:T,completional:@escaping(u结果:T?,u错误:String?)->Void){
┌── 应该是结果
restCall(fetchUrl:URL(字符串:“asdasd”)!,modelType:T){(finalResults,error)在
补全(最终结果、错误)
}
}
public class Result {
    var urlPath:URL?
}
public class FilmResult: Result, Codable {

    var count:Int?
    var next:String?
    var previous:String?
    var results:[Film]?

}
                       this was T previously  ───┐
restCall(fetchUrl: result.urlPath!, modelType: result) { (finalResults, error ) in
public func restCall<T>(fetchUrl: URL, modelType: T, completion: @escaping (_ modelObject: T?, _ error:String?) -> Void) { }

public func fetchAll<T>(result:T,  completionAll:  @escaping (_ result:T?, _ error:String?) -> Void) {

                                                          ┌── should be result   
    restCall(fetchUrl: URL(string: "asdasd")!, modelType: T) { (finalResults, error ) in
        completionAll(finalResults, error)
    }
}