调用生成发布者的泛型函数的正确语法是什么



调用以下fetchURL函数的正确语法是什么?

func fetchURL<T: Decodable>(_ url: URL) -> AnyPublisher<T, Error> {
URLSession.shared.dataTaskPublisher(for: url)
.map(.data)
.decode(type: T.self, decoder: JSONDecoder())
.eraseToAnyPublisher()
}

我在这里很困惑

let url = URL(string:"http://apple.com")
let publisher = fetchURL<[String].self>(url)????

您不能像使用struct那样直接通过指定其具体类型来调用泛型函数-Swift需要推断它。

由于T只出现在返回值中,Swift只能根据您分配返回值的类型来推断其类型,因此您需要明确它:

let publisher: AnyPublisher<[String], Error> = fetchURL(url)

这相当不方便,因此一种更好的方法是添加一个Type参数作为函数的参数,Swift现在将使用它来推断具体类型T:

func fetchURL<T: Decodable>(_ t: T.Type, url: URL) -> AnyPublisher<T, Error> {
// ...
}
let publisher = fetchURL([String].self, url: url)

例如,JSONDecoder.decode使用相同的方法


如注释中所建议的,您还可以为类型指定一个默认值,因此如果可以推断类型,则可以省略它:

func fetchURL<T: Decodable>(_ t: T.Type = T.self, url: URL) -> AnyPublisher<T, Error> {
// ...
}
let pub1: AnyPublisher<[String], Error> = fetchURL(url: url)
let pub2 = fetchURL([String].self, url: url)

最新更新