作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这样的协议(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
预计是非可选的,则进行parse
throw
并移交解码错误
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/
我是一名优秀的程序员,十分优秀!