我有一个A类,它包含一个实现协议P的对象B.
我想禁止对象B进行任何修改,而A类不承认它。是否有可能没有任何代表或相互参考?
考虑到可以指定只能由类类型对象protocol P: class {}
实现的协议,如果struct
有类似的东西,我可以将协议绑定到结构,制作它是显式的(知道结构是按值传递的),必须设置对象B但不进行编辑。
长话短说: 有没有办法强制协议实现成为结构?
答案 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"
}