Swift - Расширения протокола - Значения свойств по умолчанию

Допустим, у меня есть следующий протокол:

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
}

Как вы можете видеть, мне пришлось «соответствовать» протоколу Identifiable в структуре 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

Это происходит потому, что в протоколе Identifiable идентификатор и имя доступны только для получения. Теперь, если я изменю свойства id и name на{приготовься} Я получаю следующую ошибку:

Тип «С» не соответствует протоколу «Идентифицируемый»

Эта ошибка возникает из-за того, что я не реализовал установщик в расширении протокола ... Поэтому я изменяю расширение протокола:

extension Identifiable {
    var id: Int {
        get {
            return 0
        }

        set {

        }
    }

    var name: String {
        get {
            return "default"
        }

        set {

        }
    }
}

Теперь ошибка исчезает, но если я установлю новое значение в id или name, он получит значение по умолчанию (getter). Конечно,сеттер пуст.

Мой вопрос:Какой кусок кода я должен поместить в сеттер? Потому что, если я добавлюself.id = newValue он падает (рекурсивно).

Заранее спасибо.

Ответы на вопрос(3)

Ваш ответ на вопрос