【问题标题】:Issue in making a struct Codable使结构可编码的问题
【发布时间】:2020-05-07 17:43:07
【问题描述】:

我有带有 2 个变量的 Application 协议。我有component 结构,它有一个变量,它确认Application 协议。我需要将此struct 保存在磁盘中。所以我将其确认为Codable 协议。这样做时,我遇到了这样的错误,

“协议类型'Application'不能符合'Decodable',因为只有具体类型才能符合协议”

这是我的代码,

public protocol Application {
     var name : String {get}
     var ownerName : String {get}
}

public struct component : Codable {
     let application : Application
     private enum CodingKeys: String, CodingKey {
           case application
       }

public init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        application = try values.decode(Application.self, forKey: .application)
    }

 public func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(application, forKey: .application)
    }
 }

我是 swift 新手,如果我遗漏了一些非常明显的东西,我很抱歉。我无法解决这个问题,我需要一些正确方向的帮助。先感谢您。

【问题讨论】:

  • 你也可以粘贴你的json吗?
  • "只有具体类型才能符合协议" - 所以在这里使用具体类型。
  • Application 不是Codable 所以component 不可能。
  • 为什么要使用协议?而不是结构?
  • 应用程序需要是一个符合 codable 的结构,或者将其更改为符合要求的结构。

标签: ios swift codable decodable encodable


【解决方案1】:

您如何解决这个问题很大程度上取决于您要解决的问题。

如果您想在 JSON 中准确地存储和加载这两个键,那么 Application 应该是一个结构(如jawadAli 所说)。

如果您的意思是存储更多信息,但给定的 Component 只与一种类型的应用程序相关联,那么您希望 Component 是通用的:

public struct Component<App: Application & Codable> : Codable {
     let application : App
     ...
}

注意添加了&amp; Codable。如果所有符合 Application 的东西都应该是 Codable,那么您可以将其作为 Application 的要求:

public protocol Application: Codable {
     var name : String {get}
     var ownerName : String {get}
}

重要的是要了解这并不会使应用程序符合 Codable。这意味着为了符合 Application,类型也必须符合 Codable。永远不可能解码抽象类型(即协议)。

如果您的意思是存储更多信息,但给定的组件实际上并不知道它拥有什么样的应用程序,那么这是一个更复杂的问题(并且通常过于复杂,应该重新考虑;如果您发现重新使用大量as? 测试,那么您几乎肯定应该重新设计)。如果这是您的问题,您应该多解释一下您正在解决什么问题,我们可以讨论如何解决它。 (它通常需要某种动态类型注册系统,以及支持类型元数据的 JSON 格式。或者你可以切换到 NSCoder 而不使用 JSON。)

【讨论】:

  • 谢谢哥们。我非常感谢您的详细回答。我通过创建中间结构并将其保存在磁盘中解决了我的问题。
【解决方案2】:

使用确认可编码的结构而不是协议将解决问题

public struct Application : Codable {
     var name : String
     var ownerName : String
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-08
    • 2010-12-25
    • 2012-02-25
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多