在 Swift 中归档自定义对象 - 扩展

Posted

技术标签:

【中文标题】在 Swift 中归档自定义对象 - 扩展【英文标题】:Archiving Custom Object in Swift - Extended 【发布时间】:2018-05-28 06:33:20 【问题描述】:

我正在开发一个基于 Swift 4.0 的 ios 应用程序。该应用使用第 3 方 SDK,其中有一个模型可以说,

class Customer: NSCopying, NSObject 

    var name: String!
    var age: Int!
    var address: Address!

那时,我无法控制将模型的任何属性和签名作为其内部 SDK 进行修改。但我需要将对象存储在磁盘/用户默认值中并在需要时加载。

有可能吗?如果是,那我该怎么做呢?

【问题讨论】:

向客户添加扩展并确认 Coadable 协议,不会有帮助吗?如果我没有正确理解您的问题,请让我知道 你不能在扩展中遵守 Codable。你不能添加初始化器@SandeepBhandari 是的,我不能像 Sweeper 提到的那样添加初始化程序 @SandeepBhandari @sazzad-hissain-khan :我正在考虑调整 init 【参考方案1】:

一种方法是使用SwiftyJSON将模型对象转换为JSON数据:

extension Customer 
    func toJSON() -> JSON 
        return [
            "name": name
            "age": age
            "address": address.toJSON() // add a toJSON method the same way in an Address extension
        ]
    

    static func fromJSON(_ json: JSON) -> Customer 
        let customer = Customer()
        customer.name = json["name"].string
        customer.age = json["age"].int
        customer.address = Address.fromJSON(json["address"]) // add a fromJSON method the same way
    

现在您可以执行一些操作,例如保存到 UserDefaults

UserDefaults.standard.set(try! Customer().toJSON().rawData(), forKey: "my key")
let customer = Customer.fromJSON(JSON(data: UserDefaults.standard.data(forKey: "my key")!))

【讨论】:

感谢您的宝贵时间。还有其他方法吗?我正在使用的模型由许多其他模型组成,深度也超过 2/3,如果我需要扩展所有其他模型的桃子,那将是一项繁琐的任务:( 无论您使用哪种方式,我怀疑您必须手动处理所有类。您不必为每个人都写一个扩展名。我的意思是,您可以将Address 转换为Customer.toJSON 中的JSON,而无需创建新的Address 扩展。另一种方法是为其模型类创建Codable 包装器。

以上是关于在 Swift 中归档自定义对象 - 扩展的主要内容,如果未能解决你的问题,请参考以下文章

添加了一个自定义框架,现在 Swift 无法取消归档数据

在 Swift 中访问共享容器中的自定义对象

Maven 自定义归档扩展 - 如何使用解包依赖项?

如何在包装器 Swift View 中使用自定义 UIView 的扩展功能?

如何将自定义对象的 NSArray 归档到 Objective-C 中的文件

iOS 自定义对象及子类及模型套模型的拷贝归档存储的通用代码