【发布时间】:2021-03-18 08:24:53
【问题描述】:
我正在使用一种简单的方法在我的 Core Data DB 上运行提取请求。我将我的大部分代码都包含在一个协议中,该协议将具有某些内容将扩展的默认实现。我的代码如下:
protocol Modelable {
func testFetch<T>(type: T.Type) -> [T]?
}
extension Modelable {
func testFetch<T>(type: T.Type) -> [T]? {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Data"),
result = try? context.fetch(fetchRequest)
return result as? [T]
}
}
然后我只是在符合Modelable的结构上调用它
let modelableExtended = ModelableExtended()
print(modelableExtended.testFetch(type: SomeType.self)) // Prints
这段代码的奇怪之处在于,如果我从方法定义和调用它的位置删除type: T.Type,我会收到以下错误:
无法推断通用参数“T”
将类型传递给此方法究竟是如何使其工作的?那不只是方法本身的一个参数,传递与否不应该改变任何东西。
【问题讨论】:
-
如果你不告诉 Swift
T是什么,result应该在result as? [T]中转换成什么类型的数组? -
我对你所说的有点困惑,但我想说的是,如果我省略了
type: T.Type的 testFetch() 的参数,它会抛出could not be inferred错误而如果我包含该属性,它将转换为我传入的类型。我不明白该参数如何指示T的类型 -
对,
SomeType.self的类型为SomeType.Type。您将SomeType.Type传递给需要T.Type的方法,因此T现在由SomeType限定。没有其他信息或其他类型参数,所以我们完成了。T被推断为它的唯一绑定 -SomeType。您还想要更多的实现细节吗? -
而且 .... 如果你没有这个参数,那么 T 没有被绑定(你会得到错误)。我发布了一个答案,显示了如何尝试绑定返回类型而不是
[T]? -
This 拥有您需要的所有详细信息。 IMO,如果您只是想“围绕泛型”,那么我建议您不要深入实施。 “这是一个可以接受任何
T.Type的方法。你给它一个SomeType.Type。啊,T是SomeType!”不用担心编译器是怎么做的,只要在自然语言级别上对您有意义,您就可以理解类型推断。