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