Swift - добавление значения в массив внутри словаря - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть массив объектов, которые я хочу сохранить в словаре на основе идентификатора студента.В моем словаре мой ключ имеет тип String, а значение представляет собой массив строк.Как добавить значения в массив?

Массив моего ученика:

var studentArray = [Student(id: '1', subject: 'History'), Student(id: '2', subject: 'History'), Student(id:'1', subject: 'Maths')]

Мой окончательный словарь должен выглядеть так:

{'1': ['History', 'Maths'], '2': ['History']}

Мой код:

var dictionary = [String, [String]]()
for student in studentArray {
   dictionary.updateValue(student.subject, forKey: student.id)
}

Это дает мневыводится как:

{'1': ['Maths'], '2': ['History']}

Я пытался: dictionary[student.id].append([student.subject]), но это дает мне нулевой вывод.

Как добавить значение в массив внутри словаря?

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

РЕДАКТИРОВАТЬ: Благодаря комментарию Мартина.Фрагмент ниже - самый краткий ответ, который я могу придумать.Я был вначале , пытаясь понять это с неправильной стороны.и я получаю ошибку.См. Комментарии

struct Student { 
    let id: Int
    let subject : String
}

var studentArray = [Student(id: 1, subject: "History"), Student(id: 2, subject: "History"), Student(id:1, subject: "Maths")]

typealias Subject = String
var dict : [Int: [Subject]] = [:]

for student in studentArray {

    (dict[student.id, default: []]).append(student.subject)
}

print(dict)

Предыдущие ответы:

struct Student { 
    let id: Int
    let subject : String
}

var studentArray = [Student(id: 1, subject: "History"), Student(id: 2, subject: "History"), Student(id:1, subject: "Maths")]

typealias Subject = String
var dict : [Int: [Subject]] = [:]

for student in studentArray {
    var subjects = dict[student.id] ?? [String]()
    subjects.append(student.subject)
    dict[student.id] = subjects
}

print(dict)

Или вы можете сделать это следующим образом:

struct Student { 
    let id: Int
    let subject : String
}

var studentArray = [Student(id: 1, subject: "History"), Student(id: 2, subject: "History"), Student(id:1, subject: "Maths")]

typealias Subject = String
var dict : [Int: [Subject]] = [:]

for student in studentArray {
    if let _ = dict[student.id]{
        dict[student.id]!.append(student.subject)
    }else{
        dict[student.id] = [student.subject]
    }
}

print(dict)

в зависимости от того, чтотебе нравится

0 голосов
/ 24 ноября 2018

Все здесь слишком усложняют это.Для этой задачи есть специальный API lol

struct Student {
    let id: Int
    let subject: String
}

let students = [
    Student(id: 1, subject: "History"),
    Student(id: 2, subject: "History"),
    Student(id: 1, subject: "Maths")
]

let subjectsByStudentID = Dictionary
    .init(grouping: students, by: { $0.id })
    .mapValues { students in students.map { $0.subject } }

print(subjectsByStudentID) // => [2: ["History"], 1: ["History", "Maths"]]
0 голосов
/ 23 ноября 2018

Не проверено, но это должно работать:

var dictionary = [String: [String]]()

for student in studentArray {
    if dictionary[student.id] == nil {
        dictionary[student.id] = [String]()
    }
    dictionary[student.id]?.append(student.subject)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...