Скажем, что у меня есть следующий протокол:
protocol Identifiable {
var id: Int {get}
var name: String {get}
}
И у меня есть следующие структуры:
struct A: Identifiable {
var id: Int
var name: String
}
struct B: Identifiable {
var id: Int
var name: String
}
Как вы можете видеть, мне пришлось "соответствовать" идентификационному протоколу в структуре A и структуре B. Но представьте, если у меня было еще N структур, которые должны соответствовать этому протоколу... Я не хочу, копировать/вставлять 'соответствие (var id: Int, var name: String)
Итак, я создаю расширение протокола:
extension Identifiable {
var id: Int {
return 0
}
var name: String {
return "default"
}
}
С этим расширением теперь я могу создать структуру, которая соответствует протоколу Identifiable, без необходимости реализовывать оба свойства:
struct C: Identifiable {
}
Теперь проблема заключается в том, что я не могу установить значение для свойства id или свойства name:
var c: C = C()
c.id = 12 // Cannot assign to property: 'id' is a get-only property
Это происходит потому, что в Идентифицируемом протоколе id и name являются только gettable. Теперь, если я изменил свойства id и name на {get set}, я получаю следующую ошибку:
Тип 'C' не соответствует протоколу 'Identifiable'
Эта ошибка возникает из-за того, что я не реализовал сеттер в расширении протокола... Поэтому я меняю расширение протокола:
extension Identifiable {
var id: Int {
get {
return 0
}
set {
}
}
var name: String {
get {
return "default"
}
set {
}
}
}
Теперь ошибка исчезает, но если я устанавливаю новое значение id или name, оно получает значение по умолчанию (getter). Конечно, сеттер пуст.
Мой вопрос: Какую часть кода мне нужно установить внутри сеттера?. Если я добавлю self.id = newValue, он сработает (рекурсивный).
Спасибо заранее.