斯威夫特:我正确地使用了这些数组/字典,对吧



我不知道为什么会出现这个错误:不能对不可变值使用可变成员:"result"是不可变的。有人能帮忙吗?

class Student {
var name: String
var yearOfGraduation: Int
var grade: Grade

init(name: String, yearOfGraduation: Int, grade: Grade) {
self.name = name
self.yearOfGraduation = yearOfGraduation
self.grade = grade
}
}
// Create a function called createYearDictionary that takes in an array of Student objects
// (argument name students) and returns a dictionary that maps year of graduation to an array of
// student names that graduate in that year.
//
// Example: createYearDictionary(kanye, kim, travis, kylie, khloe) would output
// [2019: ["Kanye West", "Khloe Kardashian"], 2020: ["Kim Kardashian"], 2021: ["Travis Scott"], 2022: ["Kylie Jenner"]]
//
// When you're done, uncomment the code block below and ensure that the test cases pass.
//
// Hint: What should the return type be? Remember that the type of a dictionary is
// [TypeA: TypeB], where TypeA and TypeB could be String, Int, Bool, String arrays, etc.
func createYearDictionary(students: [Student]) -> [Int: [String]] {
var result = [Int:[String]]()

for student in students {
if (result[student.yearOfGraduation] == []) {
result[student.yearOfGraduation] = [student.name]}
else {
result[student.yearOfGraduation].append(student.name)
}
}
return result
}

非常感谢!

您正试图返回类型[Int: [Student]],但示例输出指出您应该返回的是[Int: [String]],因此您需要传递Student对象的.name属性的值。您也可以在dictionary下标中使用default参数来跳过if-else子句。

func createYearDictionary(students: [Student]) -> [Int: [String]] {
var result = [Int: [String]]()
for student in students {
if result[student.yearOfGraduation] == nil {
result[student.yearOfGraduation] = [student.name]
} else { 
result[student.yearOfGraduation]?.append(student.name)
}
}
return result
}

或者简单地使用默认值的字典下标

func createYearDictionary(students: [Student]) -> [Int: [String]] {
var result = [Int: [String]]()
for student in students {
result[student.yearOfGraduation, default: []].append(student.name)
}
return result
}

有关订阅的更多信息

您可以使用Dictionary:的init(grouping:by:)来简化createYearDictionary(students:)函数

func createYearDictionary(students: [Student]) -> [Int: [String]] {
Dictionary(grouping: students) { $0.yearOfGraduation }
.mapValues { $0.map { $0.name } }
}

从Swift 5.2使用KeyPaths:

func createYearDictionary(students: [Student]) -> [Int: [String]] {
Dictionary(grouping: students, by: .yearOfGraduation)
.mapValues { $0.map(.name) }
}

或者只使用reduce(into:_:)函数:

func createYearDictionary(students: [Student]) -> [Int: [String]] {
students.reduce(into: [:]) { result, student in
result[student.yearOfGraduation, default: []].append(student.name)
}
}

最新更新