如何在 Swift 4 中引用通用 Decodable 结构
How to reference a generic Decodable struct in Swift 4
我有一个函数,我想重用它并让它接受 Decocable 结构的参数。例如,这是我当前代码的简化(假设 "MyDecodableStruct" 是在应用程序其他地方声明的 Decodable 结构):
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
}
}
而不是说 "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
}
}
我会这样称呼它
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct)
虽然我不知道如何让它工作的语法。我得到的错误是
Type 'Results' does not conform to protocol 'Decodable'
Expected element type
关于处理此问题的最佳方法有什么想法吗?
当你想传递一个类型作为参数时,你需要将参数的类型声明为metatype。在您的情况下,它是需要符合 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)
}
}
//...
}
Swift 说类型不能嵌套在泛型上下文中,所以我把它移到了外部非泛型上下文中。
称其为:
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct.self)
我有一个函数,我想重用它并让它接受 Decocable 结构的参数。例如,这是我当前代码的简化(假设 "MyDecodableStruct" 是在应用程序其他地方声明的 Decodable 结构):
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
}
}
而不是说 "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
}
}
我会这样称呼它
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct)
虽然我不知道如何让它工作的语法。我得到的错误是
Type 'Results' does not conform to protocol 'Decodable'
Expected element type
关于处理此问题的最佳方法有什么想法吗?
当你想传递一个类型作为参数时,你需要将参数的类型声明为metatype。在您的情况下,它是需要符合 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)
}
}
//...
}
Swift 说类型不能嵌套在泛型上下文中,所以我把它移到了外部非泛型上下文中。
称其为:
getResults(url: "url", parameters: nil, myStruct: MyDecodableStruct.self)