【问题标题】:Swift - trouble appending array from classSwift - 从类中附加数组时遇到问题
【发布时间】:2015-06-08 02:31:32
【问题描述】:

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

我有以下课程:

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

【问题讨论】:

    标签: arrays swift parse-platform


    【解决方案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

    类是引用类型

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

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

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

    【讨论】:

    • 谢谢。我把它变成了一个结构,一切都很好。仍然有点困惑为什么这有效 - 我将阅读一些关于引用和值类型之间的差异。
    • 基本上结构在存储之前创建它自己的副本,而对于类,对类的引用是传递它的值,这是类和结构之间的主要区别之一。请不要忘记通过单击其一侧的复选将问题设置为已解决,如果您认为我对您有帮助,请随意单击向上箭头:)
    猜你喜欢
    • 2022-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多