gpt4 book ai didi

Swift 4 使用泛型作为返回值

转载 作者:行者123 更新时间:2023-11-28 14:14:27 25 4
gpt4 key购买 nike

我有这样的协议(protocol):

protocol ModelProtocol{

func parse<T.Model>(data: Data) -> Array<T>? {}

}

返回的是一个选项值数组。该方法接收数据,对其进行解析并从 API 数据返回已解析对象的数组。

API 返回的数据类型称为 MyData,它有一个数组作为字典的值。

我这样解析JSON

func parse<T>(data: Data) -> Array<T>? {
do {

let newJSONDecoder = JSONDecoder()
let menu = try newJSONDecoder.decode(MyData.self, from:data)
let dataArray = menu.data //array
let modelArray = Array<T>()
for object in dataArray {


modelArray.append(object)

}

return modelArray

}
catch {
print("error while parsing:\(error.localizedDescription)")
return nil
}

}

我在追加到要返回的数组的行中出错。

Cannot invoke 'append' with an argument list of type '(MyData.Drinks)'

最终,我希望返回的数组包含数组 MyData.data 中类型的对象 - 在本例中,类型为 Drinks。但更广泛地说,我希望该方法返回任何 JSON 负载中的任何类型。目标是创建一个方法,该方法可以接收任何数据并将任何对象作为数组中 X 类型的解析对象返回。

我该怎么做?

最佳答案

首先代码无法编译:

Protocol methods must not have bodies

所以你必须去掉括号:

protocol ModelProtocol{
func parse<T : Decodable>(data: Data) -> Array<T>?
}

要解决您的问题,请创建 MyData 也作为通用

struct MyData<T : Decodable> : Decodable {
let data : [T]?
}

并声明解析

func parse<T : Decodable>(data: Data) -> Array<T>? {

do {
let newJSONDecoder = JSONDecoder()
let menu = try newJSONDecoder.decode(MyData<T>.self, from:data)
return menu.data
}
catch {
print("error while parsing: ", error)
return nil
}
}

print 总是整个error 以获得关于解码错误的详细信息。 localizedDescription 过于宽泛。


如果data预计是非可选的,则进行parsethrow并移交解码错误

protocol ModelProtocol{
func parse<T : Decodable>(data: Data) throws -> Array<T>
}

struct MyData<T : Decodable> : Decodable {
let data : [T]
}

func parse<T : Decodable>(data: Data) throws -> Array<T> {
let newJSONDecoder = JSONDecoder()
let menu = try newJSONDecoder.decode(MyData<T>.self, from:data)
return menu.data
}

关于Swift 4 使用泛型作为返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52254511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com