gpt4 book ai didi

arrays - 在数组结构内部调用 init

转载 作者:行者123 更新时间:2023-11-30 10:28:57 25 4
gpt4 key购买 nike

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

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

然后

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

pauselet data = Data(pause: pause)类型为Pause struct(其结构复制如下)。但我分为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 的类型struct,我也可以调用 init init(attached: [PauseModel] = []) 。如果有人能在这方面帮助我,我将不胜感激。

非常感谢

最佳答案

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

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

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

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

  1. 您可以自己实现初始化程序,就像您对 PauseData 所做的那样:

    init(attached: [PauseModel] = []) {
    self.attached = attached
    }
  2. 您可以将 init(from detector: 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com