Skip to content

Instantly share code, notes, and snippets.

@ivangodfather
Created October 14, 2018 18:47
Show Gist options
  • Save ivangodfather/8ed07c7fa58cede24d2d0e5722d7c2f9 to your computer and use it in GitHub Desktop.
Save ivangodfather/8ed07c7fa58cede24d2d0e5722d7c2f9 to your computer and use it in GitHub Desktop.
import UIKit
var str = """
{
"report":[
{
"enrollment": "rit2011001",
"name": "Julia",
"subject":[
{
"code": "NLP",
"grade": "A"
},
{
"code": "DSA",
"grade": "A"
}
]
},
{
"enrollment": "rit2011020",
"name": "Samantha",
"subject":[
{
"code": "COM",
"grade": "B"
},
{
"code": "OOM",
"grade": "A"
},
{
"code": "DSA",
"grade": "A"
}
]
}
]
}
"""
struct ReportData: Decodable {
let report: [Report]
}
struct Report: Decodable {
let enrollment: String
let name: String
let subject: [Subject]
}
struct Subject: Decodable {
let code: String
let grade: String
}
struct Tuple {
let name: String
let enrollment: String
let code: String
let grade: String
}
func decodeReports() {
let jsonDecoder = JSONDecoder()
guard let data = str.data(using: .utf8),
let reportsData = try? jsonDecoder.decode(ReportData.self, from: data) else {
fatalError("Error decoding json")
}
let reports = reportsData.report
let tuples = reports.flatMap { report in
return report.subject.map {
return Tuple(name: report.name, enrollment: report.enrollment, code: $0.code, grade: $0.grade)}
}
let ordered = tuples.sorted {
guard $0.code == $1.code else { return $0.code < $1.code }
guard $0.grade == $1.grade else { return $0.grade > $1.grade }
guard $0.enrollment == $1.enrollment else { return $0.enrollment < $1.enrollment }
return $0.name > $1.name
}
for t in ordered {
print("\(t.code) \(t.grade) \(t.enrollment) \(t.name)")
}
}
decodeReports()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment