Swift - 从类中附加数组的麻烦 [英] Swift - trouble appending array from class

查看:19
本文介绍了Swift - 从类中附加数组的麻烦的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am having trouble understanding why the following code is replacing all of my array elements with the latest information when I am trying to just append it.

我有以下课程:

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

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

I have the following variables defined to use the class:

//the array which will hold users available to follow
    var usersAvailableArray = [usersAvailable]()
    var aUser = usersAvailable()

为了检查我的理智,我还声明了一个常规"数组,以查看我是否获得了正确的值:

to check my sanity I also have declared a 'regular' array to see if I am getting the right values:

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)")
 }

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

here is the console output I get:

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 中的每个元素?

Why is my append of usersAvailableArray replacing every element in the array UsersAvailableArray?

推荐答案

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

You are passing data to the array by reference, and in every loop you change the value of the reference:

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

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

Try to create a new user every time:

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

发生这种情况是因为您附加的对象来自一个类,来自 appe 文档:

This is happening because the object you are append come from a class, from appe documentation:

类是引用类型

与值类型不同,引用类型在被复制时不会被复制分配给一个变量或常量,或者当它们被传递给一个功能.而不是副本,引用相同的现有改为使用实例.您可以查看有关值和引用的更多信息在 Swift 中

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

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

Another solution is to change your class to a struct, like below, structs different if classes make a copy of the value when it is passes instead pass a reference.

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

这篇关于Swift - 从类中附加数组的麻烦的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆