太多的选项使代码在Swift中变得混乱

时间:2015-07-17 14:43:04

标签: json swift optional

我正在解析一些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
}

产生的输出以这种方式充斥着Optionals,几乎无法使用。我有一种感觉我做错了,因为这段代码的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)
    ]
  ]  )
])

2 个答案:

答案 0 :(得分:1)

展开选项(你已经为其中一些人做了,为所有人做了):

if let roll = dic["roll"] as? Int {
    student["roll"] = roll
}

此外,初始化程序Int(...)返回一个Optional,因此您必须使用Optional绑定解包它:

if let code = dicSub["code"] as? String, let myInt = Int(code) {
    sub["code"] = myInt
}

答案 1 :(得分:1)

根据您需要的速度,我建议您使用某些第三方库进行JSON通信。一个很好的例子是:

SwiftyJSON

您可以在这里查看有关它的教程:

http://www.raywenderlich.com/82706/working-with-json-in-swift-tutorial