在Swift中,如何使类的对象数组只能作为整个数组访问?

时间:2018-03-29 22:22:33

标签: swift

由于使用了属性观察器,我有一种模式,我希望开发人员能够访问我的类。在下面的例子中,我在下面的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

1 个答案:

答案 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