【问题标题】:using Anyobject with Codable in Swift 4在 Swift 4 中使用带有 Codable 的 Anyobject
【发布时间】:2018-09-07 01:33:13
【问题描述】:

我正在尝试在 swift 4 中使用 Codable 解析 JSON。我担心的是

public class entStatusAndDescription : NSObject {
     var status :  Int?
     var statusDescription : String?
     var records : AnyObject?
}

我希望上述实体是可编码的,但“记录”不能是特定实体, 因为这是我将从 API 收到的基本实体。 在我解析完 status 和 statusDescription 之后,我才能指定将记录哪个实体

例如我正在调用 API 以获取客户详细信息,我收到状态为 200 即成功,然后我会将记录解析为客户实体

【问题讨论】:

  • 您无法使用 Codable 解码 Any(Object)。至少您必须编写一个自定义初始化程序来确定具体类型。顺便说一句:在 Swift 中,大多数情况下你不需要继承自 NSObject 的类。为什么status 是可选的? API 很可能总是发送此密钥。
  • 是的,我知道它不会解码 Any(Object) 但是 1.我必须使用 JSONSerialization.jsonObject( with: data! , options: JSONSerialization.ReadingOptions.mutableContainers) 从接收到的数据中获取 json 作为! NSDictionary 2. 再次使用 JSONSerialization.data(withJSONObject: json, options: JSONSerialization.WritingOptions.prettyPrinted) 对记录进行序列化 3. 最后decoder.decode([entCustomer].self, from: data) 获取特定实体的实际记录
  • 我会查看状态是否为可选。感谢您的更正

标签: swift4 codable decodable encodable


【解决方案1】:

如果一个类的所有成员都是可编码的,那么它就是可编码的。当您使用通用成员时,您必须确保该成员是可编码的。在这种情况下,您可以创建对象,其中 records 成员是任意的,总是比 records 从 Codable 继承。

这对我有用:

public class entStatusAndDescription<T: Codable>: Codable {
     var status :  Int?
     var statusDescription : String?
     var records : T?
}

【讨论】:

  • 你能解释一下为什么这个改变有效吗?仅代码答案很少对其他用户有帮助,并且通常会被删除。对于像这样的老问题尤其如此,因为 OP 已经解决了他们的问题或从他们的问题中继续前进,因此您的答案的价值对于未来遇到同样问题的人来说是有价值的。
【解决方案2】:

使用旧的 JSONSerialization 解决:

let data = "[{\"key\": \"value\"}]".data(using: .utf8)
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
if let json = json as? [String: Any] {
  // parse as needed, a value can be of type Any.
}

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 2017-11-11
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2021-04-17
    • 2018-12-13
    相关资源
    最近更新 更多