即使用户未登录,即使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
,但它会被响应中收到的记录数所覆盖。
解码时如何限制?
谢谢
答案 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
}
}