Generic Func: 无法转换键路径值类型“[T]”
Generic Func: Key path value type '[T]' cannot be converted
我正在玩 Combine 来学习它并提高我的反应式编程技能,我正在尝试创建一些通用的 class 将数据转换为我的 T类型
我有这个错误,我不明白为什么
Key path value type '[T]' cannot be converted to contextual type 'T'
class Fetcher<T: Codable>: ObservableObject {
private var task: AnyCancellable?
@Published var result = [T]()
init<T: Codable> (type: T.Type) {
guard let url = URL(string: "https://api.example.com") else { return }
task = URLSession.shared.dataTaskPublisher(for: url)
.map{[=10=].data}
.decode(type: T.self, decoder: JSONDecoder())
.receive(on: DispatchQueue.global(qos: .background))
.replaceError(with: T.self as! T)
.assign(to: \.result, on: self)
}
}
由于 URL 给你一个 T
的数组,你应该解码一个数组,而不是 decode
调用中的单个 T
。这一行
.decode(type: T.self, decoder: JSONDecoder())
应该是:
.decode(type: [T].self, decoder: JSONDecoder())
replaceError
调用会使您的应用程序崩溃,因为 T.self
不是 T
(它是 T.Type
),并且您正在强制转换。由于您正在接收一个数组,因此用一个值替换错误的逻辑选择是空数组 []
:
.replaceError(with: [])
此外,删除 init
上的通用参数:
init() {
我正在玩 Combine 来学习它并提高我的反应式编程技能,我正在尝试创建一些通用的 class 将数据转换为我的 T类型
我有这个错误,我不明白为什么
Key path value type '[T]' cannot be converted to contextual type 'T'
class Fetcher<T: Codable>: ObservableObject {
private var task: AnyCancellable?
@Published var result = [T]()
init<T: Codable> (type: T.Type) {
guard let url = URL(string: "https://api.example.com") else { return }
task = URLSession.shared.dataTaskPublisher(for: url)
.map{[=10=].data}
.decode(type: T.self, decoder: JSONDecoder())
.receive(on: DispatchQueue.global(qos: .background))
.replaceError(with: T.self as! T)
.assign(to: \.result, on: self)
}
}
由于 URL 给你一个 T
的数组,你应该解码一个数组,而不是 decode
调用中的单个 T
。这一行
.decode(type: T.self, decoder: JSONDecoder())
应该是:
.decode(type: [T].self, decoder: JSONDecoder())
replaceError
调用会使您的应用程序崩溃,因为 T.self
不是 T
(它是 T.Type
),并且您正在强制转换。由于您正在接收一个数组,因此用一个值替换错误的逻辑选择是空数组 []
:
.replaceError(with: [])
此外,删除 init
上的通用参数:
init() {