Как создать общий массив c с несколькими моделями в Swift? - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь создать общий массив c с разными моделями. У меня есть такой метод парсера. Но это не работает, потому что возвращает [Any] и не является безопасным. Мне нужно получить доступ к моим объектам Mov ie и CastMember после разбора метода. Я буду использовать этот массив в моих методах делегата tableviewcontroller. Как я могу это сделать?

    static func parseSearchResult(_ data:Dictionary<String, AnyObject>) -> [Any] {

     var array = [Any]()
     let jsonData = JSON(data)
     if let resultData = jsonData["results"].arrayObject {
        let result = resultData as! [[String:AnyObject]]
          for element in result {

            if((element["media_type"]?.isEqual("person"))!){
                let person = CastMember(json: element)
                array.append(person)
            }
            else if((element["media_type"]?.isEqual("movie"))!){
                let movie = Movie(json: element)
                array.append(movie)
            }
        }
         }
      return array
}

и это мои структуры

struct CastMember{
var id : Int?
var originalName : String?
var castName : String?
var picturePath : String?

init(json: [String:Any]){
  originalName = json["name"] as? String
  id = json["id"] as? Int
  castName = json["character"] as? String
  picturePath = "https://image.tmdb.org/t/p/w200/"
  picturePath?.append((json["profile_path"] as? String) ?? "")
}

}

struct Movie{
var id : Int?
var title : String?
var imagePath : String?

init(json: [String:Any]){
  title = json["title"] as? String
  id = json["id"] as? Int
  imagePath = "https://image.tmdb.org/t/p/w200/"
  imagePath?.append((json["poster_path"] as? String)!)
}

}

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Вы должны сделать protocol

Пример:

enum MediaType {
  case movie, castMember 
}

protocol SearchResult {
  var title: String { get }
  var mediaType: MediaType { get }
}

struct SearchResultViewModel: SearchResult {

   let title: String
   let mediaType: MediaType

   init(title: String, mediaType: MediaType) {
     self.title = title
     self.mediaType = mediaType
   }
}

Тогда ваш parseSearchResult должен вернуть массив [SearchResult] объектов, соответствующих протоколу, в этом случае , массив SearchResultViewModel

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

Сделайте так, чтобы ваши классы Mov ie и CastMember подтвердили протокол Codable.

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

struct ResponseModel<T> : Codable {
   let results : [T]
}

, затем расшифруйте его так:

let response : ResponseModel = JSONDecoder.decode(T.self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...