Swift - 从类中添加数组的麻烦

时间:2015-06-08 02:31:33

标签: arrays swift parse-platform

我无法理解为什么以下代码在我尝试追加它时用最新信息替换所有数组元素。





我有以下课程:




  class usersAvailable {
 var username = String()
 var userAvatar = UIImage()
}
  




我定义了以下变量来使用该类:

& #xA;

  //将保持用户可以关注的数组
 var usersAvailableArray = [usersAvailable]()
 var aUser = usersAvailable()
  




检查我的理智我还宣布了一个'常规'数组,看看我是否正确值:




  var usersArray:[[String]] = [[“”,“”]]
  




当我执行以下代码时:




  func getAllUsers(){

 usersAvailableArray.removeAll(keepCapacity:true)
 usersArray.removeAll(keepCapacity:true)
 var query = PFQuery(className:“_ User”)
 query.findObjectsInBackgroundWithBlock {
 (对象:[AnyObject]?,错误:NSError?) - >无效
如果错误== nil {
对象中的对象! {
 self.aUser.username = object [“username”] as!字符串
 println(“追加前的aUser.username:\(self.aUser.username)”)
的println(self.aUser)
 self.usersAvailableArray.append(self.aUser)
 self.usersArray.append([self.aUser.username])
 println(“usersAvailableArray的第一个元素:\(self.usersAvailableArray.first?.username)”)
 println(“usersAvailableArray的最后一个元素:\(self.usersAvailableArray.last?.username)”)
 println(“当前在usersAvailableArray中的元素数量:\(self.usersAvailableArray.count)”)
 println(“usersArray的第一个元素:\(self.usersArray.first)”)
 println(“usersArray的最后一个元素:\(self.usersArray.last)”)
 println(“当前在usersArray中的元素数量:\(self.usersArray.count)”)
 }
  




这是我得到的控制台输出:




 附加前的aUser.username:joeBob
 ParseStarterProject.usersAvailable
 usersAvailableArray的第一个元素:Optional(“joeBob”)
 usersAvailableArray的最后一个元素:Optional(“joeBob”)
当前元素的数量in usersAvailableArray:1
 usersArray的第一个元素:Optional([“joeBob”])
 usersArray的最后一个元素:Optional([“joeBob”])
当前在usersArray中的元素数量:1&# xA;附加前的aUser.username:monkey
 ParseStarterProject.usersAvailable
 usersAvailableArray的第一个元素:Optional(“monkey”)
 usersAvailableArray的最后一个元素:Optional(“monkey”)
 number of of usersAvailableArray中当前的元素:2
 usersArray的第一个元素:Optional([“joeBob”])
 usersArray的最后一个元素:Optional([“monkey”])
 usersArray中当前元素的数量: 2
附加前的aUser.username:support
 ParseStarterProject.usersAvailable 
 usersAvailableArray的第一个元素:Optional(“support”)
 usersAvailableArray的最后一个元素:Optional(“support”)
 usersAvailableArray中当前元素的数量:3
 usersArray的第一个元素:可选([“joeBob”])
 usersArray的最后一个元素:可选([“support”])
当前在usersArray中的元素数量:3
  
&# xA;


为什么我追加usersAvailableArray会替换数组UsersAvailableArray中的每个元素?




1 个答案:

答案 0 :(得分:1)

您通过引用将数据传递给数组,并在每个循环中更改引用的值:

self.aUser.username = object["username"] as! String
self.usersAvailableArray.append(self.aUser)

每次尝试创建一个新用户:

var newUser = usersAvailable()
newUser.username = object["username"] as! String
self.usersAvailableArray.append(newUser)

这种情况正在发生,因为你追加的对象来自appe documentation的一个类:

  

类是引用类型

     

与值类型不同,引用类型不会被复制   分配给变量或常量,或者当它们被传递给a时   功能。而不是副本,对同一存在的引用   而是使用实例。您可以看到有关值和引用的更多信息   在斯威夫特

另一个解决方案是将类更改为结构,如下所示,如果类在传递时复制值而不是传递引用,则结构会不同。

struct usersAvailable {
    var username = String()
    var userAvatar = UIImage()
}