由于使用了属性观察器,我有一种模式,我希望开发人员能够访问我的类。在下面的例子中,我在下面的B.a和A.str上有属性观察者,所以如果开发人员尝试直接修改B.a.str,则只触发str属性观察者。因此,我想限制对B.a的访问仅限于设置和获取整个数组,使得修改必须在直接访问B之外发生(即,您将在下面看到)。我一直在阅读很多关于Swift 4+的Apple文档,我无法弄明白。示例如下:
class A
{
let str: String? = "Hello!"
...
}
class B
{
var a: [A]()
...
}
我不希望用户像这样使用这组类:
let b: B = B()
B.a.str? = "NewValue"
如何仅通过此模式使“a”可访问:
let a_ref = b.a
a_ref.str? = "NewValue"
b.a = a_ref
答案 0 :(得分:2)
我不确定你为什么要这种模式,我不确定使用它是否是个好主意。无论如何,当您使用a
提供的getter时,只需返回B
的副本即可实现您想要的效果。
class A {
var str: String?
init(str: String? = "Hello") {
self.str = str
}
func copy() -> A {
return A(str: str)
}
}
class B {
private var _a = A()
var a: A {
get { return _a.copy() }
set { _a = newValue }
}
init() { }
}
现在您可以使用以下代码对其进行测试:
// First Attempt (Direct)
let b: B = B()
b.a.str = "NewValue"
print(b.a.str) // Prints "Hello"
// Second Attempt (via Reference)
let a_ref = b.a
a_ref.str = "NewValue"
b.a = a_ref
print(b.a.str) // Prints "NewValue