1

私は非常に迅速で、私のコードでは特定の電子メールから JSON を取得します。JSON データは最初に迅速に配列に入れられますが、配列が null であるか、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 が null の場合、この行でエラーが発生します

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 に答える