在 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 View 中使用自定义 UIView 的扩展功能?