无法使用类型为(([[Notice]?]))的参数列表调用“ decode”

时间:2019-08-05 05:25:23

标签: swift codable decodable

当我确认可解码协议时,如何快速从解码器解码列表

struct ActiveModuleRespones:Codable {
    var Notice:[Notice]?
    var Module:[Module]?


    public init(from: Decoder) throws {
        //decoding here
        let container = try from.singleValueContainer()
        self.Notice = try? container.decode([Notice].self)
    }

}

遇到此错误:

Cannot invoke 'decode' with an argument list of type '([[Notice]?])'

截屏: enter image description here

请帮助,

2 个答案:

答案 0 :(得分:2)

它与变量本身混淆。更改变量名称以对其进行修复。

struct ActiveModuleRespones: Codable {
    var notice: [Notice]?
    var module: [Module]?

    public init(from: Decoder) throws {
        //decoding here
        let container = try from.singleValueContainer()
        self.notice = try? container.decode([Notice].self)
    }
}

在Swift中,所有类型都具有 UpperCamelCase 名称,几乎其他都具有 lowerCamelCase 名称。

最后,使用try?将杀死所有异常,并且您永远不会知道出了什么问题,请改用此方法:

self.notice = try container.decode([Notice]?.self)

答案 1 :(得分:0)

如果您需要可选值,请将decodeIfPresent与非可选类型一起使用,不要使用try?

struct ActiveModuleRespones: Decodable {
    var notice: [Notice]?

    enum CodingKeys: String, CodingKey {
       case notice
    }

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        self.notice = try container.decodeIfPresent([Notice].self, forKey: .notice)
    }
}