Struct 如何在Swift 4中引用通用可解码结构
我有一个我想重用的函数,并让它接受Decocable结构的参数。例如,这是我当前代码的简化(假设“MyDecodableStruct”是应用程序中其他地方声明的可解码结构): 而不是说“MyDecodableStruct”,我希望它是作为参数传入的任何可解码结构。大概是这样的:Struct 如何在Swift 4中引用通用可解码结构,struct,swift4,decodable,Struct,Swift4,Decodable,我有一个我想重用的函数,并让它接受Decocable结构的参数。例如,这是我当前代码的简化(假设“MyDecodableStruct”是应用程序中其他地方声明的可解码结构): 而不是说“MyDecodableStruct”,我希望它是作为参数传入的任何可解码结构。大概是这样的: static func getResults(url: String, parameters: Parameters, myStruct: Decodable) { // On success REST res
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
}
}
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)
}
}
//...
}
我可以这样称呼它
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct)
但是,我无法理解如何让它工作的语法。我得到的错误是
Type 'Results' does not conform to protocol 'Decodable'
Expected element type
关于处理这个问题的最佳方法有什么想法吗?当您想将类型作为参数传递时,需要将参数的类型声明为元类型。在您的情况下,它是一个泛型类型,需要符合
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
}
}
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)
}
}
//...
}