我想使用Any
类型的变量,以便将不同的类传递给子视图控制器。例如,我可能有Table,Chair和Plate对象。在我的子视图控制器中,我想更改其中一个属性的值(例如,Table.legs为4,将其更改为3),并且父视图控制器能够从子视图中读取它VC。我将使用协议来更新可以在读取更新的对象后弹出子节点的父VC。
为了弄清楚泛型的传递是如何起作用的,我在操场上写了这段代码:
class Table {
var legs: Int
var material: String
init(legs: Int, material: String) {
self.legs = legs
self.material = material
}
}
var anObject: Any?
// set up the Table
let aTable = Table(legs: 4, material: "Oak")
// set anObject to be the Table
anObject = aTable
// get the object and change it
let bTable = anObject as! Table
bTable.legs = 3
// get the original object and cast it as a Table
let cTable = anObject as! Table
print(cTable.legs) // prints 3
我相信,我应该能够做到我上面描述的没有任何问题,因为每当我更新引用它的变量时,原始对象引用(anObject
)都会更新。
我的问题是 - 采用这种方法时我应该注意哪些陷阱?看来,不是创建一个对象的副本,swift总是会创建一个指向原始对象的指针;有什么情况不成立吗?
如果这被认为是一个相当基本的问题,请注意,但这对我来说都是相当新的 - 非常感谢提前!
答案 0 :(得分:2)
Struct
是您注意到的引用类型,如果您将类的实例分配给变量,它会将引用(指针在内存中)保留到实例而不是值副本。
while(!isValid){
System.out.println("Enter house number: ");
if(input.hasNextInt()){
houseNum=input.nextInt();
isValid=true;
}
else{
System.err.print("Wrong input. Try again");
isValid=false;
}
}
是值类型,如果将结构的实例复制到另一个变量,它只是复制到变量。