有人能解释一下为什么这样不行吗?我有一个类,它的工厂方法如下:public class NetworkTask<T> { var request: URLRequest var completionHandler: NetworkResponse<T> -> Void init(request: URLRequest, completionHandler: NetworkResponse<T> -> Void) { self.request = request self.completionHandler = completionHandler } static func dataResponseTaskWithRequest(request: URLRequest, completionHandler: NetworkResponse<NSData> -> Void) -> NetworkTask<NSData> { return NetworkTask<NSData>(request: request, completionHandler: completionHandler) } static func mappedObjectResponseTaskWithRequest<MappedType>(request: URLRequest, completionHandler: NetworkResponse<MappedType> -> Void) -> NetworkTask<MappedType> { return NetworkTask<MappedType>(request: request, completionHandler: completionHandler) }}然后,在高兴地知道它是编译的之后,我去创建一个这样的任务:let task = NetworkTask.dataResponseTaskWithRequest(URLRequest()) { (response) in }不。。。无法推断泛型参数t等等,我可以很清楚地推断出来,这个方法返回NetworkTask<NSData>,所以t是nsdata。好啊。。。那么,也许是这样?let task: NetworkTask<NSData> = NetworkTask.dataResponseTaskWithRequest(URLRequest()) { (response) in}不。。。无法使用类型为“(urlrequest,(?)>”的参数列表调用“dataresponsetaskwithrequest”好吧,也许另一种方法是:let task = NetworkTask.mappedObjectResponseTaskWithRequest(URLRequest()) { (response: NetworkResponse<String>) in}不。。。无法将类型为“(networkresponse)->()”的值转换为预期值参数类型“networkresponse->void”我一定是遗漏了一些东西,因为编译器不能有这么多错误。有人知道吗? 最佳答案 NetworkTask<T>是类型,而不是NetworkTask。也就是说,参数T在类上,使用该类所做的一切,以及访问其类方法,都需要描述该类型。即使T没有包含在给您提供编译器错误的方法声明中,也没有类NetworkTask会包含所有不包含类型参数的类方法–想象一下,对于任何值NetworkTask<T>,方法都在所有类T上。这类似于C++,其中对应的甚至被称为“模板”,意思是用泛型类型参数的类声明用作模板来编译不同的类。这与Java不同,其中泛型语法只是用类型擦除的编译时糖(您确实可以调用类方法——在这种情况下只有一个类真的存在)。下面是一个简单的例子来进一步演示:class A<T> { class func foo() { } class func bar(t:T) -> Void { }}class B {}A.foo() // this gives an error because the type cannot be inferred.A.bar(1) // this works fine without compiler errors as the integer literal type can be inferred there.在上面的示例中,可以调用a,例如:A<IntegerLiteralType>.foo()您可能应该考虑本例中的方法是否属于具有该类型参数T的类,或者它们是否应该具有其他作为接收器的对象(或者它们是否应该是自由函数?)是的。关于swift - 无法推断通用参数T。工厂方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37061033/
10-11 10:41