Протокол реализуется только через struct или неизменный - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть класс A, который содержит объект B, реализующий протокол P.

Я хотел бы запретить любые модификации объекта B без подтверждения классом A.Возможно ли это без какого-либо делегата или взаимной ссылки?

Учитывая, что можно указать протокол, который может быть реализован только объектами типа класса protocol P: class {}, если есть что-то подобное для struct s, яможет связать протокол со структурой, сделав явным (будучи известно, что структуры передаются по значению), что объект B должен быть установлен, но не отредактирован.

Короче говоря: Есть ли способ заставить реализацию протокола быть структурой?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2018

Протоколы не должны использоваться таким образом. Протоколы должны определять поведение, а не точную форму объекта.

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

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"
}
0 голосов
/ 24 апреля 2018

Единственное, что я хотел бы предложить, - это обернуть класс A протоколом Q и определить внутри него переменный установщик экземпляра протокола P.

protocol Q {
var p: P? { get set } 
}
class A: Q {
var p: P? {
get {
// logic
}
set {
//logic
}
}
}
...