如何解决我该如何解决:由于“未知上下文”而无法投放?
场景:
函数需要一个通用参数( CovidResource )来从服务器获取数据,该服务器将根据函数参数 CovidResource 的值以特定格式返回数据。>
目的是使用一(1)个功能以格式/端点的形式从各种端点中获取数据。
该函数以 CovidResource 格式返回结构 AppleSubRegions (在本示例中为通过通用值的任何可能的数据类型之一)。
let url = URL(string: "https://disease.sh/v3/covid-19/apple/countries/CANADA")!
countryListViewModel.getList(urlDataModel: CovidResource<AppleSubRegions>(url: url))
struct AppleSubRegions: Codable {
let country,subregion: String
let data: [AppleDatum]
}
import Combine
import UIKit
protocol URLResource {
associatedtype DataModel: Decodable
var url: URL? { get }
}
struct CovidResource<T: Decodable>: URLResource {
typealias DataModel = T
var url = URL(string: "https://disease.sh/v3/covid-19/apple/countries/Canada")
}
// =====================================================================================================
class CountryRegionListModel: ObservableObject {
@Published var countryRegionList: [String] = []
// Data Persistence:
var cancellables: Set<AnyCancellable> = []
// ---------------------------------------------------------------------------
func getList<Resource>(urlDataModel: Resource) where Resource: URLResource {
let remoteDataPublisher = URLSession.shared.dataTaskPublisher(for: urlDataModel.url!)
.map(\.data)
.handleEvents(receiveOutput: { data in
print(String(data: data,encoding: .utf8)!)
})
.receive(on: DispatchQueue.main)
.decode(type: Resource.DataModel.self,decoder: JSONDecoder())
//.print("getList: ")
remoteDataPublisher
.eraseToAnyPublisher()
.sink(receiveCompletion: { completion in
switch completion {
case .finished:
print("Publisher Finished")
case let .failure(anError):
Swift.print("\nReceived error: ",anError)
}
},receiveValue: { someValue in
print("\n\n ---- Model: \(someValue)")
DataSource.shared.countryName = (someValue as! AppleSubRegions).country
}).store(in: &cancellables)
}
}
您可以看到返回的数据类型为“ AppleSubRegions ”:
(注意'未知上下文 ...)吗?
(lldb) po type(of: someValue)
Covid19.TabNavView.(unknown context at $10bb96490).(unknown context at $10bb96504).AppleSubRegions
我可以通过调试器看到国家/地区“ 加拿大”:
---- Model: AppleSubRegions(country: "Canada",subregions: ["Alberta","Calgary","Edmonton","British Columbia","Vancouver","Manitoba","New Brunswick","Newfoundland and Labrador","Northwest Territories","Halifax","Nova Scotia","Ontario","Ottawa","Toronto","Prince Edward Island","Montreal","Quebec","Saskatchewan","All","Yukon Territory"])
(lldb) po someValue.country
"Canada"
我尝试通过代码重复调试器的操作:
...但是您可以看到,数据模型不知道'国家':
但是我无法访问其成员。
所以我尝试将'someValue'强制转换为 AppleSubRegions 类型:
哪个崩溃了编译。
问题:如何将 CovidResource 转换为 AppleSubRegions 正确的(Swift数据项)?
建议尝试
1.通过
...receiveValue { someValue: AppleSubRegions in
但是我遇到了编译器语法错误:
- 添加其他约束:
但这会导致另一个编译器错误:
解决方法
如果您将类型进一步限制为AppleSubRegions
,这应该可以工作:
func getList<R: URLResource>(urlDataModel: R) where R.DataModel == AppleSubRegions {
let remoteDataPublisher = Just(json)
.receive(on: DispatchQueue.main)
.decode(type: R.DataModel.self,decoder: JSONDecoder())
remoteDataPublisher
.sink(
receiveCompletion: {...},receiveValue: { someValue in
print(someValue.country)
}).store(in: &c)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。