Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中创建具有多个模型的通用阵列?_Ios_Swift_Generics - Fatal编程技术网

Ios 如何在Swift中创建具有多个模型的通用阵列?

Ios 如何在Swift中创建具有多个模型的通用阵列?,ios,swift,generics,Ios,Swift,Generics,我正在尝试创建一个具有不同模型的通用数组。我有一个这样的解析器方法。但是它不起作用,因为它返回[Any],并且它不是类型安全的。在解析方法之后,我需要访问我的电影和CastMember对象。我将在tableviewcontroller委托方法中使用此数组。我该怎么做 static func parseSearchResult(_ data:Dictionary<String, AnyObject>) -> [Any] { var array = [Any]()

我正在尝试创建一个具有不同模型的通用数组。我有一个这样的解析器方法。但是它不起作用,因为它返回
[Any]
,并且它不是类型安全的。在解析方法之后,我需要访问我的电影和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
}

使您的电影和CastMember类符合协议编码

您还必须编写一个与响应数据匹配的结构或类,就像它必须有一个结果数组和响应中的任何其他键一样

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

您应该制定一个
协议

例如:

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
   }
}

然后您的
parsearchresult
应该返回一个符合协议的
[SearchResult]
对象数组,在这种情况下,一个
SearchResultViewModel

数组,您可以尝试创建一个
MediaType
协议,该协议符合
Movie
CastMember
,然后,您的函数将返回
[MediaType]
而不是
[Any]
。yesimvs:请共享您的模型结构/类。您应该真正考虑调整
可编码
协议,以便从JSON轻松提取数据。
let response : ResponseModel = JSONDecoder.decode(T.self)
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
   }
}