Вы должны обрабатывать это в Member
, а не Discount
, потому что каждый тип Codable
должен иметь возможность декодировать независимо.
Сначала добавьте это к Discount
, чтобы только имя расшифровывается:
enum CodingKeys : CodingKey {
case discountName
}
Затем реализуем пользовательское декодирование в Member
:
enum CodingKeys: CodingKey {
case dateOfBirth, discounts
}
public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
dateOfBirth = try container.decode(Date.self, forKey: .dateOfBirth)
discounts = try container.decode([Discount].self, forKey: .discounts)
for i in 0..<discounts!.count {
discounts![i].memberDateOfBirth = dateOfBirth
}
}
В конце для l oop мы даем значения скидкам.
Возвращаясь к Discount
, вы можете сделать discountType
вычисляемым свойством, зависящим от memberDateOfBirth
, или добавить didSet
наблюдателя в memberDateOfBirth
, где вы установите discountType
.
var discountType: String? {
if let dob = memberDateOfBirth {
if dob < Date(timeIntervalSince1970: 0) {
return "Type 1"
}
}
return "Type 2"
}
// or
var memberDateOfBirth: Date? {
didSet {
if let dob = memberDateOfBirth {
if dob < Date(timeIntervalSince1970: 0) {
discountType = "Type 1"
}
}
discountType = "Type 2"
}
}