Протоколы не должны использоваться таким образом. Протоколы должны определять поведение, а не точную форму объекта.
Я предполагаю, что, ограничивая протокол структурами, которые вы хотите добиться неизменяемости его исполнителей. Если это так, мы можем разработать протокол только с геттерами
protocol Foo {
var foo: string { get }
}
Таким образом, Foo
является неизменным, и его нельзя изменить из любого места, независимо от того, struct
или class
.
Затем мы можем унаследовать FooMutable
от Foo
и добавить туда мутаторы
protocol FooMutable: Foo {
var foo: string { get set }
}
Наконец class A
- единственное место, где мы можем мутировать Foo
:
class A {
private var fooValue: FooMutable = FooImpl()
var foo: Foo { get { return fooValue } }
func mutateFoo() {
fooValue.foo = "bar"
}
}
class FooImpl: FooMutable {
var foo = "foo"
}