Анализирам малко 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)
]
] )
])