在可解码协议中设置模型阵列的容量

时间:2019-11-29 03:38:33

标签: ios swift codable decodable

即使用户未登录,即使JSON响应包含更多记录,我也希望设置模型数组的最大容量。

public class AlertsInbox: Codable {
    public var messages: [Messages]?
    public init(messages: [Messages]) {
        self.messages = messages
        if !GlobalVar.isLoggedIn,
            let capacity = GlobalVar.messageCapacity {
            self.messages?.reserveCapacity(capacity)
        }
    }
}

解码json响应:

let responseMessage = try JSONDecoder().decode(AlertsInbox.self, from: data)

在模型的初始化中使用reserveCapacity,但它会被响应中收到的记录数所覆盖。

解码时如何限制?

谢谢

1 个答案:

答案 0 :(得分:1)

您不应有条件地从Type的初始化程序中从数组中删除/删除元素。这种考虑违反了Model对象的责任角色。相反,这是控制器对象的工作。

但是您可以在模型类型中具有一个接入点。假设您的messages对象中有一个属性AlertsInbox。您可以拥有另一个具有另一个属性的访问点,例如limitedMessages,它将是计算属性。

看下面的代码。我有意将类型的语义从Class更改为Struct。但是您可以根据需要自由使用。

struct AlertsInbox: Codable {
    let messages: [Message]

    var limitedMessages: [Message] {
        // here you will use the value of your limit
        // if the limit exceeds the size of the array, whole array will be returned
        return Array(messages.prefix(5))
    }

    struct Message: Codable {
        let title: String
    }
}

现在,当您需要实际消息的精简版本时,将像使用其他任何属性一样使用此属性。像alertInbox.limitedMessages而不是messages属性。


但是,如果您对以上内容不满意并且想要坚持计划,您也可以这样做。参见:

struct AlertsInbox: Codable {
    let messages: [Message]

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let messages = try container.decode([Message].self, forKey: .messages)
        // the idea of limiting the element numbers is same as the above
        self.messages = Array(messages.prefix(5))
    }

    struct Message: Codable {
        let title: String
    }
}