swift - '(AnyObject)' не является подтипом 'NSObject' - PullRequest
1 голос
/ 16 января 2020

Я новичок в быстрой разработке, я следовал учебному пособию, и все было хорошо, пока я не наткнулся на эту ошибку, и я не знаю, как ее исправить. Вы можете мне помочь?

if let json = response.result.value {
    let jsonArray:NSArray = json as! NSArray
    /// On fait la boucle pour avoir la liste globale des éléments a afficher
    for i in 0..<jsonArray.count {
        self.OPlays.append(Playlist(
            title:(jsonArray[i] as AnyObject).value(forKey: "title") as? String,
                artist:(jsonArray[i] as AnyObject).value(forKey: "artist") as? String,
                categorie:(jsonArray[i] as AnyObject).value(forKey: "categorie") as? String,
                cover_url:(jsonArray[i] as AnyObject).value(forKey: "cover_url") as? String)
        )
    }
    self.tableViewPlaylist.reloadData()
}        

Файл новостей правильный.

if let json = response.result.value {
    let jsonArray:NSArray = json as! NSArray

    /// On fait la boucle pour avoir la liste globale des éléments a afficher
    for i in 0..<jsonArray.count {
        self.OPlays.append(Playlist(
            id: (jsonArray[i] as AnyObject).value(forKey: "id") as? Int,
            title: (jsonArray[i] as AnyObject).value(forKey: "title") as? String,
            artist: (jsonArray[i] as AnyObject).value(forKey: "artist") as? String,
            cover_url: (jsonArray[i] as AnyObject).value(forKey: "cover_url") as? String,
            categorie: (jsonArray[i] as AnyObject).value(forKey: "categorie") as? String
        ))
    }
    self.tableViewPlaylist.reloadData()
}

1 Ответ

3 голосов
/ 16 января 2020

Я бы вырезал весь этот AnyObject код:

if let array = response.result.value as? [[String: Any]] {
    for dictionary in array {
        self.OPlays.append(Playlist(
            id: dictionary["id"] as? Int,
            title: dictionary["title"] as? String,
            artist: dictionary["artist"] as? String,
            categorie: dictionary["categorie"] as? String,
            cover_url: dictionary["cover_url"] as? String
        ))
    }
    self.tableViewPlaylist.reloadData
}

Лично я бы сделал go шаг вперед и ушел бы из бизнеса декодирования вашего JSON вручную. Используйте JSONDecoder.

struct Playlist: Codable {
    let id: Int?
    let title: String?
    let artist: String?
    let categorie: String?
    let cover_url: String?
}

Затем, если у вас есть data, который является развернутым Data объектом:

do {
    self.OPlays = JSONDecoder().decode([Playlist].self, from: data)
} catch {
    print(error)
}

Или, если вы используете Alamofire, подумайте Alamofire 5, использующий JSONDecoder метод response.

...