协议仅由struct或immutable实现

时间:2018-04-24 11:25:36

标签: swift struct protocols swift4

我有一个A类,它包含一个实现协议P的对象B.

我想禁止对象B进行任何修改,而A类不承认它。是否有可能没有任何代表或相互参考?

考虑到可以指定只能由类类型对象protocol P: class {}实现的协议,如果struct有类似的东西,我可以将协议绑定到结构,制作它是显式的(知道结构是按值传递的),必须设置对象B但不进行编辑。

长话短说: 有没有办法强制协议实现成为结构?

2 个答案:

答案 0 :(得分:1)

我唯一建议的是用协议Q包装A类,并在里面定义协议P实例的变量setter。

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

答案 1 :(得分:1)

协议不应该以这种方式使用。协议是定义行为,而不是对象的确切形状。

我假设通过将协议限制为您希望实现其实现者不可变性的结构。如果是这样,我们可以用getter设计协议

protocol Foo {
    var foo: string { get }
}

这种方式Foo是不可变的,无论是struct还是class,它都无法从任何地方进行更改。

然后,我们可以从FooMutable继承Foo并在那里添加mutators

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"
}