K M*_*K M 8 struct swift4 decodable
我有一个我想重用的函数,并让它接受一个Decocable结构的参数.例如,这是我当前代码的简化(假设"MyDecodableStruct"是在应用程序的其他地方声明的可解码结构):
static func getResults(url: String, parameters: Parameters) {
// On success REST response
if response.result.isSuccess {
struct Results: Decodable {
let items: [MyDecodableStruct]
}
if let jsonResults = try? JSONDecoder().decode(Results.self, from: response.data!) {
//success
}
}
Run Code Online (Sandbox Code Playgroud)
而不是说"MyDecodableStruct",我希望它是我作为参数传递的任何Decodable结构.像这样的东西:
static func getResults(url: String, parameters: Parameters, myStruct: Decodable) {
// On success REST response
if response.result.isSuccess {
struct Results: Decodable {
let items: [myStruct]
}
if let jsonResults = try? JSONDecoder().decode(Results.self, from: response.data!) {
//success
}
}
Run Code Online (Sandbox Code Playgroud)
我会称之为
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct)
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何让它工作的语法.我得到的错误是
Type 'Results' does not conform to protocol 'Decodable'
Expected element type
Run Code Online (Sandbox Code Playgroud)
有关处理此问题的最佳方法的任何想法?
OOP*_*Per 13
当你想传递一个类型作为参数,你需要声明的参数作为类型元类型.在您的情况下,它是一个需要符合的泛型类型Decodable.
所以你可能需要写这样的东西:
struct Results<Element: Decodable>: Decodable {
let items: [Element]
}
static func getResults<Element: Decodable>(url: String, parameters: Parameters?, myStruct: Element.Type) {
//...
// On success REST response
if response.result.isSuccess {
do {
let jsonResults = try JSONDecoder().decode(Results<Element>.self, from: response.data!)
//success
print(jsonResults)
} catch {
//Better not dispose errors silently
print(error)
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
Swift说类型不能嵌套在通用上下文中,所以我把它移到了外部非泛型上下文中.
称之为:
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct.self)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3237 次 |
| 最近记录: |