Swift Generics - 在视图控制器之间更改值和传递

时间:2016-12-09 09:17:52

标签: ios swift generics

我想使用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总是会创建一个指向原始对象的指针;有什么情况不成立吗?

如果这被认为是一个相当基本的问题,请注意,但这对我来说都是相当新的 - 非常感谢提前!

1 个答案:

答案 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; } } 是值类型,如果将结构的实例复制到另一个变量,它只是复制到变量。