arrays - Swift - 从类中追加数组时遇到问题

标签 arrays swift parse-platform

我无法理解为什么当我试图附加它时,以下代码将我的所有数组元素替换为最新信息。

我有以下类(class):

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

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

//the array which will hold users available to follow
    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 {
            (objects: [AnyObject]?, error: NSError?) -> Void in
            if error == nil {
                for object in objects! {
                  self.aUser.username = object["username"] as! String
                    println("aUser.username before append: \(self.aUser.username)")
                    println(self.aUser)
                    self.usersAvailableArray.append(self.aUser)
                    self.usersArray.append([self.aUser.username])
                    println("first element of usersAvailableArray: \(self.usersAvailableArray.first?.username)")
                    println("last element of usersAvailableArray: \(self.usersAvailableArray.last?.username)")
                    println("number of elements currently in usersAvailableArray: \(self.usersAvailableArray.count)")
                    println("first element of usersArray: \(self.usersArray.first)")
                    println("last element of usersArray: \(self.usersArray.last)")
                    println("number of elements currently in usersArray: \(self.usersArray.count)")
 }

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

aUser.username before append: joeBob
ParseStarterProject.usersAvailable
first element of usersAvailableArray: Optional("joeBob")
last element of usersAvailableArray: Optional("joeBob")
number of elements currently in usersAvailableArray: 1
first element of usersArray: Optional(["joeBob"])
last element of usersArray: Optional(["joeBob"])
number of elements currently in usersArray: 1
aUser.username before append: monkey
ParseStarterProject.usersAvailable
first element of usersAvailableArray: Optional("monkey")
last element of usersAvailableArray: Optional("monkey")
number of elements currently in usersAvailableArray: 2
first element of usersArray: Optional(["joeBob"])
last element of usersArray: Optional(["monkey"])
number of elements currently in usersArray: 2
aUser.username before append: support
ParseStarterProject.usersAvailable
first element of usersAvailableArray: Optional("support")
last element of usersAvailableArray: Optional("support")
number of elements currently in usersAvailableArray: 3
first element of usersArray: Optional(["joeBob"])
last element of usersArray: Optional(["support"])
number of elements currently in usersArray: 3

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

最佳答案

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

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 :

Classes Are Reference Types

Unlike value types, reference types are not copied when they are assigned to a variable or constant, or when they are passed to a function. Rather than a copy, a reference to the same existing instance is used instead. You can see more about values and references in Swift

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

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

关于arrays - Swift - 从类中追加数组时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30700528/

相关文章:

ios - 为什么我的指数不会高于 1?

ios - 从 ActivityViewController 的某些共享插件返回时应用程序崩溃

angularjs - 构建 AngularJS 包后,如何使用 NodeJS 作为后端请求服务器来部署 AngularJS

ios - PFUser 返回 NIl?

C中用函数计算数组长度

c++ - 在 C++ 中使用冒泡排序对结构数组的成员进行排序

arrays - 如何在普通的lisp中获取数组的行大小和列?

swift - 在屏幕边缘生成 Sprite ,同时将 anchor 保持在中心

ios - 在重置密码之前解析或验证用户名和电子邮件

c - 二维数组的问题