2017-11-03 6 views
-1

JSONからのデータを配列に保存しようとしていますが、最後の項目は前の値を上書きします。私は学生情報を格納するためのStudentクラスと、学生のスキルを格納するためのSkillクラスを持っています。私の配列の最後の要素は、すべての前の要素を上書きします

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

Iスキルの配列をループし、それが私のstudentSkills配列に追加し、最後に追加される値と正しい値を印刷するには、プリントアウトされます。

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ループ内で上記printからの出力

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ループ

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

'class Student'は*参照型です*すべての配列要素は*同じインスタンスへの参照です* - これは前に尋ねられ、返答されていなければなりません... –

+0

https://stackoverflow.com/の可能な複製質問/ 36000146/swift-array-append-overwriting-other-array-valuesのようになります。 –

+0

ありがとうマーティンR、私は迅速に新しいです。 – julekgwa

答えて

0

常に同じスキルをアレイに追加します。そして、それを修正するたびにforループ。毎回新しいSkillを作成する必要があります。 Skillは値型(struct)があった場合

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

あなたのアプローチはうまくいくが、それは参照型(class)と同じオブジェクトを指しています。

+0

ありがとう、私はまだ迅速に学んでいます。 – julekgwa

関連する問題