Я разбираю JSON, и это первый раз, когда я делаю это на Swift. В последнее время я избегаю принудительного приведения вниз, так как это плохая практика.
К сожалению, недостатком этого является то, что мой код стал намного более беспорядочным, особенно в этом конкретном случае попытки парсить JSON.
Это мой код:
if let dic = try NSJSONSerialization.JSONObjectWithData(currentData!, options: NSJSONReadingOptions.AllowFragments) as? [String: AnyObject] {
student["roll"] = dic["roll"] as? Int
student["firstName"] = dic["name"]?.componentsSeparatedByString(" ").first
student["lastName"] = dic["name"]?.componentsSeparatedByString(" ").last
var subjects = [[String: AnyObject?]]()
if let dicSubs = dic["subs"] as? [AnyObject] {
for dicSub in dicSubs {
var sub = [String: AnyObject?]()
sub["name"] = dicSub["name"] as? String
if let code = dicSub["code"] as? String {
sub["code"] = Int(code)
}
if let theory = dicSub["theory"] as? String {
sub["theory"] = Int(theory)
}
if let prac = dicSub["prac"] as? String {
sub["prac"] = Int(prac)
}
subjects.append(sub)
}
}
student["subjects"] = subjects
}
Таким образом, полученный результат замусорен опционами, что делает его практически непригодным для использования. У меня такое чувство, что я делаю что-то не так, поскольку версия этого кода на языке Objective C намного чище и короче.
Есть ли способ сделать это лучше?
Если необходимо, вот результат:
[
roll:Optional(1234567),
firstName:Optional("FIRSTNAME"),
lastName:Optional("LASTNAME"),
subjects:Optional( [
[
"code":Optional(123),
"theory":Optional(73),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(76),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(48),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(75),
"prac":Optional(19),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(69),
"prac":Optional(18),
"name":Optional(REDACTED)
],
[
"code":Optional(123),
"theory":Optional(63),
"prac":Optional(28),
"name":Optional(REDACTED)
]
] )
])