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