Присвойте некоторое пустое значение общему классу в swift - PullRequest
1 голос
/ 01 ноября 2019

Я анализирую API, используя универсальную модель по умолчанию. Ниже приведен мой BaseModel Class

class BaseModel<T : Codable>: Codable {
    var StatusCode : Int
    var StatusMessage : String
    var Data : T
    var ErrorMessage : String
    }

. Я не использую необязательные, чтобы избежать разворачивания, вместо этого я предоставляю ему некоторое значение по умолчанию со следующим инициализатором.

required init(from decoder: Decoder) throws {
        do {
            let container = try decoder.container(keyedBy: CodingKeys.self)
            self.StatusCode = try container.decodeIfPresent(Int.self, forKey: .StatusCode) ?? -1
            self.StatusMessage = try container.decodeIfPresent(String.self, forKey: .StatusMessage) ?? "no message"
            self.Data = try container.decodeIfPresent(T.self, forKey: .Data) ?? 
            self.ErrorMessage = try container.decodeIfPresent(String.self, forKey: .ErrorMessage) ?? "default error"
        }
    }

Я присваиваю пустую строку для строковых значений и -1 для значений Int. Я застрял, присваивая какое-то значение Generic? Какой тип данных общего назначения можно принять, если я назначу "" пустую строку для строки, а не для гниды?

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Поскольку T соответствует Codable, вы можете использовать те же init(from:) из протокола Decodable

self.Data = try container.decodeIfPresent(T.self, forKey: .Data) ?? T(from: decoder)

Это, конечно, требует, чтобы T мог создать «пустой» объект, если он можетя считаю, что вам нужно идти с дополнительным

0 голосов
/ 01 ноября 2019

Один из способов сделать это - ограничить T дополнительным протоколом HasDefaultValue:

protocol HasDefaultValue {
    static var defaultValue: Self { get }
}

class BaseModel<T : Codable & HasDefaultValue>: Codable {
    var StatusCode : Int
    var StatusMessage : String
    var Data : T
    var ErrorMessage : String
}

И вы можете соответствовать String, Int и любому типу, который вы хотите HasDefaultValue:

extension String : HasDefaultValue {
    static let defaultValue = ""
}

extension Int : HasDefaultValue {
    static let defaultValue = -1
}

extension Optional : HasDefaultValue {
    static var defaultValue: Optional<Wrapped> { return Optional.none }
}

Теперь вы можете сделать:

self.Data = try container.decodeIfPresent(T.self, forKey: .Data) ?? T.defaultValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...