1

我对 swift 非常陌生,在我的代码中,我从某封电子邮件中获取 JSON,JSON 数据首先快速放入一个数组中,但是如果数组为空或没有 Json 数据,我会收到此错误

无法将“NSNull”(0x1067a5748)类型的值转换为“NSArray”(0x1067a4c58)。

我一直试图通过阅读其他帖子来解决这个问题,例如检查可选数组是否为空但它不起作用。问题出现在下面的代码中

session.dataTask(with:request, completionHandler: {(data, response, error) in
            if error != nil {
                   print(error)
            } else {
                do {

                    let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any]
                    if let musicJob = parsedData["music"] as! [AnyObject]?  {

    for S in musicjob {
                        if let genre = S["genre"] as? String {
                            self.genres.append(genre)
                        }
}
}

如果 Json 为空,我会在此处收到此行的错误

if let musicJob = parsedData["music"] as! [AnyObject]?

musicJob计算对象的数量,例如“30 个值或 44 个值”等。如果没有 Json 则返回 nil 并崩溃。无论如何我可以捕获 nil 或空数组的值,以便应用程序不会崩溃?只要 musicJob 数组不为空,一切都会再次运行。

4

3 回答 3

6

尝试这个:

if let musicJob = parsedData["music"] as? [AnyObject]
于 2016-11-23T04:46:17.067 回答
4

您可以同时检查两者nil并清空Array这样的。

if let musicJob = parsedData["music"] as? [Any], !musicJob.isEmpty {
    print(musicJob)
}
于 2016-11-23T04:47:49.833 回答
1

是的。您始终可以使用条件展开。 强制展开通常很危险(崩溃),应小心使用。

首先,guard在做任何事情之前使用确保满足先决条件是一个好习惯。

if guard let responseData = data else {
    assertionFailure("response data is nil") // no need for assertionFailure is data is expected to be nil sometimes
    return
}

与崩溃的行类似:

if let musicJob = parsedData["music"] as? [AnyObject] {
    ....
}
于 2016-11-23T04:53:56.337 回答