我创建了一个城市类,它由几个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版
答案 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
对象指向内存中的不同位置。