当前位置: 首页 > 知识库问答 >
问题:

数组中的最后一个元素将覆盖之前的所有元素

郑承恩
2023-03-14

我试图将JSON中的数据保存到数组中,但最后一项覆盖了前面的值。我有一个用于存储学生信息的学生类和一个用于存储学生技能的技能类。

public class Skill {
    public var id : Int = 0
    public var name : String = ""
    public var level : Double = 0.0

    func description() -> String {
        return "ID: \(id), " +
            "name: \(name), " +
        "level: \(level)"
    }
}

学生班

public class Student {

    public var studentSkills = Array<Skill>()


    func setCursusUsers(data: [[String: AnyObject]]) {
        for item in data {
            let skills = Skill()
            if let resData = item["skills"]  {
                let stu_data = resData as! [[String: AnyObject]]
                for skill_item in stu_data {
                    skills.id = skill_item["id"] as? Int ?? 0
                    skills.level = skill_item["level"] as? Double ?? 0.0
                    skills.name = skill_item["name"] as? String ?? ""
                    studentSkills.append(skills)
                    print(studentSkills[studentSkills.count - 1].description())
                }
                for skill in studentSkills {
                    print(skill.description())
                }
            }
        }
    }
}

我在技能数组上循环,并将其附加到我的学生技能数组,并打印最后一个附加的值,正确的值被打印出来。

for skill_item in stu_data {
    skills.id = skill_item["id"] as? Int ?? 0
    skills.level = skill_item["level"] as? Double ?? 0.0
    skills.name = skill_item["name"] as? String ?? ""
    studentSkills.append(skills)
    print(studentSkills[studentSkills.count - 1].description())
 }

for循环中,从上述打印输出

ID: 16, name: Company experience, level: 11.34
ID: 4,  name: Unix, level: 7.4
ID: 17, name: Object-oriented programming, level: 4.59
ID: 3,  name: Rigor, level: 3.24
ID: 7,  name: Group & interpersonal, level: 3.02
ID: 2,  name: Imperative programming, level: 2.98
ID: 6,  name: Web, level: 2.32
ID: 13, name: Organization, level: 1.8
ID: 14, name: Adaptation & creativity, level: 1.14
ID: 5,  name: Graphics, level: 1.12
ID: 10, name: Network & system administration, level: 0.98
ID: 12, name: DB & Data, level: 0.87
ID: 15, name: Technology integration, level: 0.82
ID: 1,  name: Algorithms & AI, level: 0.76
ID: 11, name: Security, level: 0.45

当我在上面的循环之外运行以下代码

for skill in studentSkills {
    print(skill.description())
}

我得到以下输出

ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 11, name: Security, level: 0.45
ID: 7, name: Group & interpersonal, level: 0.21
ID: 7, name: Group & interpersonal, level: 0.21
ID: 7, name: Group & interpersonal, level: 0.21
ID: 7, name: Group & interpersonal, level: 0.21

这是我的JSON的结构

"cursus_users" : [
  {
    "skills" : [
      ...,
      ...,
      ...,
      ...,
      ...,
      ...,
      ...,
      ...,
      {
        "id" : 11,
        "name" : "Security",
        "level" : 0.45
      }
    ],
    ...
  },
  {
    "skills" : [
      ...,
      ...,
      ...,
      {
        "id" : 7,
        "name" : "Group & interpersonal",
        "level" : 0.21
      }
    ],
    ...
  }
]

技能数组的最后一个元素覆盖了前面的元素,我如何解决这个问题?


共有1个答案

段劲
2023-03-14

你总是在数组中附加相同的技能。每次您在循环中修改它。你应该每次都创建新的技能

for skill_item in stu_data {
     let skills = Skill()
     ...
}

如果Skill是一个值类型(struct),但它是一个引用类型(class),并且指向同一个对象,那么您的方法就会起作用。

 类似资料:
  • 假设我有这样的html: 我只想获得之前的 。有没有办法用JSOUP做到这一点呢?我知道我可以把所有的宠物都弄成这样: 但这也包括额外的宠物。我想知道我是只能选择上面的宠物还是只是删除下面的宠物然后使用那个代码?

  • 本文向大家介绍JavaScript数组中的第一个元素和最后一个元素?,包括了JavaScript数组中的第一个元素和最后一个元素?的使用技巧和注意事项,需要的朋友参考一下 数组是一组元素。每个元素都有其自己的 索引值。我们可以使用这些索引访问任何元素。但是,对于最后一个元素,直到知道数组中存在的元素数量,我们才知道索引。在这种情况下,我们必须使用逻辑。让我们简要地讨论这些细节。 访问第一个元素 因

  • 我试图返回所有元素,除了中的最后一个元素,如果tuple中只有两个元素,则返回第一个。由于有很多编译时工具,所以应该可以使用双返回类型。以下是我目前掌握的情况: 如果我能以c 17友好的方式来做这件事,那就太好了。我在上述实现中遇到以下错误: /元组。cpp:36:55:错误:包扩展不包含任何未扩展的参数包 返回std::tuple_cat(std::make_tuple(std::get)。。。

  • 本文向大家介绍php中删除数组的第一个元素和最后一个元素的函数,包括了php中删除数组的第一个元素和最后一个元素的函数的使用技巧和注意事项,需要的朋友参考一下 对于一个php数组,该如何删除该数组的第一个元素或者最后一个元素呢?其实这两个过程都可以通过php自带的函数 array_pop 和 array_shift 来完成,下面就具体介绍一下如何来操作。 (1)使用 array_pop 删除数组的

  • 本文向大家介绍js获取数组的最后一个元素,包括了js获取数组的最后一个元素的使用技巧和注意事项,需要的朋友参考一下 在js里面如何获取一个数组的最后一个元素呢?这里总结了两种方法,有需要的朋友可以看看。 (1)js内置pop方法 pop() 方法用于删除并返回数组的最后一个元素,注意这里在获取了数组的最后一个元素的同时也将原数组的最后一个元素给删除了。如果数组已经为空,则该方法不改变数组,并返回

  • 返回数组中的最后一个元素。 使用 arr.length - 1 来计算给定数组的最后一个元素的索引并返回。 const last = arr => arr[arr.length - 1]; last([1, 2, 3]); // 3