有人可以向我解释为什么这行不通吗?
我有一个带有工厂方法的类,如下所示:
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)
}
}
然后,在高兴地知道它可以编译之后,我去创建一个像这样的Task:
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 <_>->无效'
我在这里肯定会丢失一些东西,因为编译器不会有太多错误。有人有任何线索吗?
NetworkTask<T>
是类型,不是NetworkTask
。也就是说,该参数T
位于类上,并且您对该类所做的所有操作以及访问其类方法的操作都需要描述该类型。
即使T
不会给您带来编译器错误的方法声明中包含,也没有类NetworkTask
可以包含所有不包含类型参数的类方法-可以设想该方法在所有类上都NetworkTask<T>
具有的任何值T
。这类似于C ++,在C ++中,相应的甚至被称为“模板”,这意味着带有泛型类型参数的类声明将用作模板,从字面上编译不同的类。例如,这与Java有所不同,在Java中,泛型语法只是带有类型擦除的编译时糖(您确实可以在其中调用class方法-在这种情况下,仅存在一个类)。
这是一个演示更多示例的最小示例:
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
,或者它们是否应具有其他内容作为接收者(或者实际上它们是否应为自由函数?)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句