调用生成发布者的通用函数的正确语法是什么?
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)
调用以下 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)