Swift数组引用问题

时间:2015-08-17 01:45:48

标签: swift

这是我的代码:

    var productsList:[Product]

    switch category {
    case 0:
        productsList = self.sharedInstance.productsList1
    case 1:
        productsList = self.sharedInstance.productsList2
    default:
        productsList = self.sharedInstance.productsList3
    }

    for productDic in products {
        let product = Product()
        // Set product attributes here.
        productsList.append(product)
    }

    println(productsList)
    println(self.sharedInstance.productsList1)
    println(self.sharedInstance.productsList2)
    println(self.sharedInstance.productsList3)

输出:

  • productsList包含一些添加的内容
  • productsList1productsList2productsList3都是空的。

根据我的理解,productsList应根据类别引用productsList1,productsList2和productsList3之一。

有人可以解释为什么productsList1,productsList2和productsList3都是空的吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

从sharedInstance分配数组会导致正在复制的数组。

进行更新后,您需要将更新的数组重新分配给sharedInstance数组。

作为一个最小的例子:

@interface TabController ()
@property (nonatomic, retain) UIView * circleView;
@end

将导致输出:

  

“[String1,String2,String3]”   “[String1,String2,String3,String4]”

您需要添加重新分配才能使列表匹配:

var list:[String] = []

list.append("String1")
list.append("String2")
list.append("String3")

var list2:[String] = list

list2.append("String4")

println(list)
println(list2)

您还可以通过在分配后打印每个列表的地址并显示它们不同来演示副本。

//...
list2.append("String4")
list = list2
println(list)
println(list2)

或者您可以检入调试器。

如果要专门对阵列的sharedInstance副本进行操作,可以执行以下操作之一:

  • 您可以将它们放在父数组属性中,而不是3个单独的属性,并在switch语句中选择索引,而不是新变量
  • 将数组包装在自定义类中,其实例通过引用传递。

你也可以使用NSMutableArray,虽然它可能不是最好的想法混合旧的和新的。