gpt4 book ai didi

swift - 无法推断通用参数 T。工厂方法

转载 作者:搜寻专家 更新时间:2023-11-01 06:19:23 24 4
gpt4 key购买 nike

有人可以向我解释为什么这行不通吗?

我有一个工厂方法是这样的:

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

}

没有...

Generic parameter T could not be inferred

等等,我可以清楚地推断出来,方法返回NetworkTask<NSData> , 所以 T 是 NSData。

好吧...那么,也许像这样?

let task: NetworkTask<NSData> = NetworkTask.dataResponseTaskWithRequest(URLRequest()) { (response) in

}

没有...

Cannot invoke 'dataResponseTaskWithRequest' with an argument list of type '(URLRequest, (_) -> _)'

好的,也许还有另一种方法:

let task = NetworkTask.mappedObjectResponseTaskWithRequest(URLRequest()) { (response: NetworkResponse<String>) in

}

没有...

Cannot convert value of type '(NetworkResponse) -> ()' to expected argument type 'NetworkResponse<_> -> Void'

我肯定在这里遗漏了一些东西,因为编译器不可能有那么多错误。有人知道吗?

最佳答案

NetworkTask<T>是类型,不是 NetworkTask .即参数T在类上,您对该类所做的一切,以及访问其类方法,都需要描述该类型。

即使 T不包含在给您编译器错误的方法声明中,没有类 NetworkTask这将包含所有不包含类型参数的类方法——想象一下该方法在所有类上 NetworkTask<T>对于 T 的任何值.这类似于 C++,其中相应的甚至称为"template",这意味着您使用泛型类型参数的类声明用作字面上编译不同类的模板。这与例如 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com