在我从Json获得的旧数据版本中,Pause数据不在数组中,因此我使用以下代码行进行单元测试:

let pause = Pause(attached: [PauseModel(range: 40 ..< 305)])


然后

let data = Data(pause: pause)
try lits.process(data: data)


pause中的let data = Data(pause: pause)Pause结构的类型(其结构复制在下面)。但是我将Pause结构分为两个结构(第一个结构可以视为根(以Pause命名):

public struct Pause: Decodable {

   public let pause: [PauseData]

   private enum CodingKeys: String, CodingKey {
      case lists
      case pause
   }

   public init(from decoder: Decoder) throws {
      let series = try decoder.container(keyedBy: CodingKeys.self).nestedContainer(keyedBy: CodingKeys.self, forKey: .lists)
      breaks = try series.decode([pauseData].self, forKey: .pause)
   }
}


如您所见,PauseData在数组内部。

public struct PauseData: Decodable {

   public let attached: [PauseModel]

   init(attached: [PauseModel] = []) {
      self.attached = attached
   }

   private enum CodingKeys: String, CodingKey {
      case attached = "attached"
   }
}


所以我需要再次写这一行:

let pause = Pause(attached: [PauseModel(range: 40 ..< 305)])


我可以这样做:

let pause = PauseData(attached: [PauseModel(range: 40 ..< 305)])


但是let pause应该是Pause结构的类型。因此,我需要以某种方式将这行代码重写为Pause结构的类型,并且我也可以调用init init(attached: [PauseModel] = [])。如果有人可以帮助我,我将不胜感激。

非常感谢

最佳答案

因此,一个Pause包含一个PauseData数组,每个数组都包含PauseModel数组,我得到了那个写信吗?在这种情况下,我认为您正在寻找的只是

let pause = Pause(attached: [
    PauseData(attached: [PauseModel(range: 40 ..< 305)])
])


但是,这些结构的命名确实令人困惑。它们的名称是不同的,没有区别。

现在的问题是,没有Pause.init(attached:)初始化程序。通常,编译器会为您合成一个称为“成员明智的初始化程序”的成员。问题是您指定了自己的初始化程序(init(from decoder: Decoder) throws),因此编译器不再为您合成成员方式的初始化程序。有两种解决方法。


您可以自己实现初始化程序,就像使用PauseData一样:

init(attached: [PauseModel] = []) {
    self.attached = attached
}

您可以将您的init(from decoder: Decoder) throws实现移至扩展名,以便编译器可以为您合成成员初始化器:

public struct Pause {
   public let pause: [PauseData]
}

extension Pause: Decodable {
   private enum CodingKeys: String, CodingKey {
      case lists
      case pause
   }

   public init(from decoder: Decoder) throws {
      let series = try decoder.container(keyedBy: CodingKeys.self).nestedContainer(keyedBy: CodingKeys.self, forKey: .lists)
      breaks = try series.decode([pauseData].self, forKey: .pause)
      self.init(pause: breaks)
   }
}

关于arrays - 在数组结构内部调用init,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59557494/

10-12 23:57