2016-11-23 48 views
1

我對swift非常陌生,在我的代碼中,我從某個電子郵件中獲取JSON,JSON數據首先被放入一個數組中,但是如果數組爲空或不存在的JSON數據我得到這個錯誤IOS快速如何檢查空數組同時獲取Json數據

無法投類型的值「NSNull」(0x1067a5748)到「的NSArray」(0x1067a4c58)。

我一直試圖通過閱讀其他帖子,如Check if optional array is empty,但它不工作。這個問題帶有以下

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,那麼它返回零,它崩潰。 無論如何,我可以捕捉到零值或空數組的值,以便應用程序不會崩潰?只要musicJob數組不爲空,再一次都可以使用。

+1

想想大概意思時刻被迫展開可選到可選('爲[AnyObject]'!?)。除此之外,Swift 3中未指定的JSON類型始終是Any,而不是AnyObject。 – vadian

回答

6

試試這個:

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

謝謝你的工作 – user1949387

3

可以選中這兩個nil和空對Array這樣。

if let musicJob = parsedData["music"] as? [Any], !musicJob.isEmpty { 
    print(musicJob) 
} 
1

是的。您始終可以使用條件解包。 Force unwrapping通常很危險(碰撞),應該小心使用。

首先,使用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] { 
    .... 
}