Swift中自定义对象和自定义对象数组的通用属性[重复]
Posted
技术标签:
【中文标题】Swift中自定义对象和自定义对象数组的通用属性[重复]【英文标题】:Generic property for Custom Object and Array of Custom Object in Swift [duplicate] 【发布时间】:2020-07-15 16:44:17 【问题描述】:我从 API 收到两种不同格式的响应
1.作为对象的数据
code: 0,
message: “string”,
data :
…
2.作为对象数组的数据
code: 0,
message: “string”,
data : [
…
,
…
]
我目前正在使用两种模型来获取解析后的 JSON,并且运行良好。
public class BaseModel : Decodable
var code:Int?
var message:String?
public class DataObject<T> : BaseModel
var data : T?
public class DataArray<T> : BaseModel
var data : [T] = []
有没有办法让一个通用属性可以保存一个自定义对象或一组自定义对象?
更新根据建议,我已要求 API 团队更新响应。
【问题讨论】:
您可以使用带有属性关联值的枚举。但是,为什么不总是将属性建模为一个数组(如果不是数组,则为一个项目) 有时返回单个对象和有时返回数组的 API 似乎是糟糕的 API 设计。它应该总是返回相同的东西。如果只有一个对象,它应该返回一个包含一个对象的数组。如果可能,我建议您尝试进行更改。 相关:***.com/questions/58513344/… 【参考方案1】:您可以在 Codable
模型中实现 init(from:)
并使用自定义解析来实现此功能。
public class BaseModel: Decodable
var code: Int
var message:String
var data: [DataObject]
enum CodingKeys: String, CodingKey
case code, message, data
required public init(from decoder: Decoder) throws
let container = try decoder.container(keyedBy: CodingKeys.self)
code = try container.decode(Int.self, forKey: .code)
message = try container.decode(String.self, forKey: .message)
if let dataValue = try? container.decode(DataObject.self, forKey: .data)
data = [dataValue]
else
data = try container.decode([DataObject].self, forKey: .data)
public class DataObject: Decodable
....
【讨论】:
以上是关于Swift中自定义对象和自定义对象数组的通用属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章