做作业的时候遇到一个问题,我将dataSource部分的代码从TableViewController中分离出来。然而,问题在于dataSource内部需要一个数组(称为Array B)进行后续的操作。而我一开始又觉得原来的TableViewController中的另一个数组(称为Array A)也不应该删除。因为那时候我是在TableViewController里面对dataSource进行初始化,并将这个Array A以参数形式传给dataSource的方法来对dataSource进行初始化。所以两个数组都不应该删除。结果导致同样内容的数组重复存储了。
然后我重新看了Swift的传值这里的知识点。作以下笔记:
1.有这样两种传值方式:值传递和引用传递。假如,C值传递D之后,对C作改变不会影响D,因为D是另一个对象,只不过在一开始传了之后D对象的所有属性值和C相等。然后,引用传递的话,改变C会影响D,因为他们指向同一个对象。
2.对于class类型,是引用传递。对于struct是值传递。然后,像是数组,字典,这些他们都是struct,所以都是值传递。(也就是说我作业做的那样是不对的,会产生两份一样的数组)
有2个解决方案:一个是在数组外面再套一个class类型,这样传的时候就是引用传递了,不产生新的数据副本。另一个是在AppDelegate中定义这个数组初始化这个数组。然后,在ViewController或是dataSource内部通过 UIApplication.shared.delegate as AppDelegate来获取AppDelegate的引用之后再取这个数组的各个数据。如果直接拿整个数组出来,又会是struct的传递,又会是值传递,也就是说还是会创造新的数据副本。还有就是这两个方法可以合起来做
网友评论