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

What is the correct syntax for calling a generic function that generates a publisher?

调用以下 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 仅出现在 return 值中,Swift 只能根据您将 return 值分配给的类型推断其类型,所以你需要明确说明:

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)