在我从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/