如何在 Swift 4 中引用通用的可解码结构
Posted
技术标签:
【中文标题】如何在 Swift 4 中引用通用的可解码结构【英文标题】:How to reference a generic Decodable struct in Swift 4 【发布时间】:2018-04-08 06:58:35 【问题描述】:我有一个想要重用的函数,并让它接受 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
而不是说“MyDecodableStruct”,我希望它是我作为参数传入的任何可解码结构。像这样的:
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
关于处理此问题的最佳方法的任何想法?
【问题讨论】:
【参考方案1】:当你想将一个类型作为参数传递时,你需要将参数的类型声明为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)
【讨论】:
以上是关于如何在 Swift 4 中引用通用的可解码结构的主要内容,如果未能解决你的问题,请参考以下文章
如何在作为协议类型的 Swift 通用数据结构中使用弱引用?