Не удалось преобразовать значение типа «Swift .__ SwiftDeferredNSArray» (0x104cd8ae8) в «NSMutableArray» (0x7fff87c52960) - PullRequest
0 голосов
/ 27 января 2020

Ниже строки кода выдает ошибку,

let response1 : NSMutableArray = NSMutableArray.init(array: (JSON.object as! NSMutableArray).value(forKey: "media_list") as! NSArray)

Поскольку ошибка говорит, что я понимаю, что это исключение приведения, но я не могу изменить код, чтобы он работал. Я новичок в Swift, поэтому любая помощь будет принята с благодарностью. Ниже мой JSON .объект

Итак, я проверил, и это мой JSON .объект

[["offset": 30119146, "file_size": 30119146, "filename": video_220120201129271580.mp4, "mediaPath": file:///Users/evuser/Library/Developer/CoreSimulator/Devices/B9B0232F-237D-4413-BB81-BD5FAC727305/data/Containers/Data/Application/401D5D91-4500-434A-98FE-BD416135A1C7/Documents/video_220120201129271580.mp4, "status": completed, "group_id": fKQ2Xd9bE0cXchsw, "createdDate": 2020/01/22 13:59:47, "_id": 5e27e4d3138c8801cd3c26ca, "user_id": 21, "mime_type": video/mp4, "dest_path": /video_220120201129271580.mp4, "resource_id": 3a743d84-eafe-41e5-9f4c-dece67598c32], 
["offset": 6435018, "file_size": 6435018, "filename": video_220120201127525480.mp4, "mediaPath": file:///Users/evuser/Library/Developer/CoreSimulator/Devices/B9B0232F-237D-4413-BB81-BD5FAC727305/data/Containers/Data/Application/401D5D91-4500-434A-98FE-BD416135A1C7/Documents/video_220120201127525480.mp4, "status": completed, "group_id": ffoHuGL0Z17vOqY9, "createdDate": 2020/01/22 13:58:10, "_id": 5e27e472138c8801cd3c26c9, "user_id": 21, "mime_type": video/mp4, "dest_path": /video_220120201127525480.mp4, "resource_id": 50e34fd5-b488-4861-aedd-03ea1ed0d91c]]

1 Ответ

1 голос
/ 27 января 2020

Кажется, что JSON.object не может быть массивом. Или, по крайней мере, не изменяемый массив. Нам будет трудно определить вашу проблему, не заглядывая в JSON.object. Быстрое исправление может быть на самом деле

let response1 : NSMutableArray = NSMutableArray.init(array: (JSON.object as! NSArray).value(forKey: "media_list") as! NSArray)

, но я бы попробовал еще немного покопаться. Попробуйте проверить, что именно происходит, и постарайтесь избежать старых объектов Objective- C Next Step (NS). Делайте это шаг за шагом:

let response1: [Any]? = {
    guard let mainArray = JSON.object as? [Any] else {
        print("Outer object is not an array. Check type of \(JSON.object)")
        return nil
    }
    var mutableVersionOfArray = mainArray // This already creates a mutable copy because we used "var" instead of "let"
    guard let mediaList = mutableVersionOfArray.value(forKey: "media_list") as? [Any] else {
        print("Inner object is not an array. Check type of \(mutableVersionOfArray.value(forKey: "media_list"))")
        return nil
    }
    return mediaList    
}()

Но этот код не имеет смысла для меня. Глядя на ваш код, я ожидаю, что ваш JSON объект выглядит примерно так:

{
    "media_list": [{}, {}]
}

, в этом случае вы смотрите словари. Попробуйте следующее:

let mediaList: [Any]? = {
    guard let topDictionary = JSON.object as? [String: Any] else {
        print("Outer object is not a dictionary. Check type of \(JSON.object)")
        return nil
    }
    guard let mediaListItem = topDictionary["media_list"] else {
        print("There is no media_list in payload")
        return nil
    }
    guard let mediaList = mediaListItem as? [Any] else {
        print("mediaList is not an array")
        return nil
    }
    return mediaList
}

Надеюсь, вы увидите разницу между массивом и словарем. Массив содержит несколько N упорядоченных элементов, в то время как в словаре есть пары ключ-значение. Таким образом, чтобы получить доступ к значению под ключом, вы называете его dictionary[key]. Весь ваш код, если вы правы, может быть просто:

let response1 = (JSON.object as? [String: Any])?["media_list"] as? [Any]

, но если он возвращает ноль, может быть немного сложно отладить, что пошло не так.

...