我正在尝试编写我的第一个认真的Xcode项目,而我对Swift 5的了解还不多。因此,我什至不确定所想到的是否足够有意义。
我手头的项目涉及许多JSON文件的获取和解码。响应有两种或三种模式。因此,我认为我会写一个func
并将其响应模式传递给它。
我使用decode<T>(_ type: T.Type, from data: Data): JSONDecoder
解码我的数据。该函数的第一个参数显然具有类型T.Type
。但实际上它应该是Codable.Protocol
类型。
有没有办法让我Codable
得到它?
这是我的功能:
func requestPageContent(forCodable codable: Codable, completion: @escaping (Result<PageContent, Error>) -> Void) {
DispatchQueue.global(qos: .default).async {
if let jsonData = try? Data(contentsOf: self) {
if let requestResults = try? JSONDecoder().decode(type(of: codable).self, from: jsonData) {
DispatchQueue.main.async {
completion(.success(requestResults))
}
} else {
print("error: json decoder")
}
} else {
print("error: fetch data")
}
}
}
谢谢。
答案 0 :(得分:1)
您是说requestPageContent
是通用的,像这样:
func requestPageContent<Content: Codable>(forCodable codable: Content,
completion: @escaping (Result<Content, Error>) -> Void) {
...
if let requestResults = try? JSONDecoder().decode(Content.self, from: jsonData) {
...
这表示您正在请求某些在编译时已知的特定于 内容类型。