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中自定义对象和自定义对象数组的通用属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象类和自定义属性添加到 LDIF 文件?

内置对象和自定义对象的原型链

使用usort和自定义比较函数的多维数组/对象排序

sort方法和自定义比较器的写法

Swift:获取由某个属性过滤的对象数组的索引

Swift 2.0 按属性对对象数组进行排序