我试图声明一个类型类私有集合变量,但我想知道如何将其扩展到其属性。
我有:
class ClassA{
var name:String?
}
然后在ClassB中
class ClassB{
private (set) aCLassA = ClassA()
}
那是我在其他班级上得到的结果:
var classB = ClassB()
classB.aCLassA = ClassA() //-->Expected Error
classB.aClassA.name = "NewName" //--> I want that to give an error
也许是重复的,但我不知道它的名字
答案 0 :(得分:1)
由于ClassA
是引用类型,因此您可以想到以下这一行:
private (set) var aCLassA = ClassA()
好像它说:“只有我(ClassB的实例)才可以更改aClassA
指向的内容。”
在ClassA
指向的aClassA
实例上设置一个属性,不会改变指针,它只会改变ClassB
未“检测到”的实例本身,因为所有它知道它仍然希望在指向ClassA
的内存地址处找到aClassA
的实例。
您可以将ClassA
上的所有相关属性标记为private(set)
,以获取所需的行为。另外,您可以将ClassA
设为类似struct
的值类型,以便对ClassA
的任何属性进行赋值都会导致aClassA
的实际值发生变化。>
您可以在操场上尝试一下以查看行为:
struct ClassA {
var name = "ClassA"
}
class ClassB {
private(set) var aClassA = ClassA()
}
let b = ClassB()
b.aClassA.name = "Hello" // throws error