用对象填充数组

时间:2015-11-16 10:42:14

标签: swift object

我创建了一个城市类,它由几个City对象组成,每个对象都有特定的数据。由于数据是固定的,我想在Cities对象的init()函数中分配它。

// CASE 1 - ERROR

class Cities : NSObject {
   var cityList:[City]   
   override init() {
      cityList  = []
      let city = City()

      city.fill("LA" , "USA")
      self.cityList.append(city)
      city.fill("Amsterdam" ,"Netherlands")
      self.cityList.append(city)
      city.fill("Beijing" , "China")
      self.cityList.append(city)
  

结果:北京北京北京

// CASE 2 - CORRECT

class Cities : NSObject {
   var cityList:[City]
   override init() {
       cityList  = []
       var city:City

       city = City(name: "LA" ,country: "USA")
       self.cityList.append(city)
       city = City(name: "Amsterdam", country: "Netherlands")
       self.cityList.append(city)
       city = City(name: "Beijing" , country: "China")
       self.cityList.append(city)
  

结果:洛杉矶,阿姆斯特丹,北京

当我运行第一个脚本时,我得到一个不错的Cities对象,该数组中有3个城市,全部是北京。

在正确的情况下,数据由对象City的init函数分配。现在一切都按预期工作了。

在这两种情况下,我只创建了一个城市对象:城市。为什么Swift行为会有所不同? 使用Apple Swift 2.1版

2 个答案:

答案 0 :(得分:1)

在第一种情况下,您创建单个City对象,然后用不同的数据填充它,但是当您调用{{{}时,它是您创建一次的一个对象,只是将三个指针放在数组中。 1}}你改变了这个单个对象内部的数据,并且在你的fill末尾你有一个包含3个指向一个包含最后数据的对象的数组

在第二种情况下,您创建3个不同的对象并将其添加到数组

答案 1 :(得分:1)

在案例1中,您只创建了一个City对象,这是创建对象的行:

let city = City()

City是一个类,它是一个引用类型。这意味着它将您指向内存中的相同位置。您第一次致电:

city.fill("LA" , "USA")

将属性设置为' LA'和' USA',第二次电话

city.fill("Amsterdam" ,"Netherlands")

转到内存中的相同位置并使用新值覆盖属性,第3次调用也是如此,这是最后一次调用,因此您最终得到了值。 你的数组cityList有三个项目指向内存中的相同位置,这就是你看到同一个对象的原因:

cityList[0] === cityList[1] === cityList[2]

在案例2中,每次创建新对象时都要调用构造函数,例如:

City(name: "LA" ,country: "USA")

构造函数分配新内存地址,最终以全新对象结束,因此每次调用时都会:

City(name:...)

您的city对象指向内存中的不同位置。