-2

努力弄清楚如何处理具有不同类型和结构的可解码数组。本质上它是一个数据数组,这导致了一个包含 4 种类型的数组,并且这些类型中的每一种都包含进一步的搜索结果数组。

您可以将 decodeable 用于具有不同格式的数组吗?还是只是使用对象字典?

我将在底部附上我的 JSON

struct SearchData: Decodable  {
var success: Bool
var server_response_time: Int
var data: [SearchDataType]
}

//This is the array of 3 of the group types: "Movies", "TV-Shows", "Artists"

struct SearchDataType: Decodable   {
let group: String
let data: [SearchDataMovies]
}


// Where group = "Movies"
struct SearchDataMovies: Decodable {
    let title: String
    let year: String
}

// Where group = "TV-Shows"
struct SearchDataTV: Decodable  {
    let title: String
    let year: Int
}
// Where group = "Artists"
struct SearchDataArtists: Decodable  {
    let name: String
}

在此处输入图像描述

4

1 回答 1

2

Decodable 不会将您组中的字符串视为不同的组。所以有组:“组:电影”、“组:电视”和“组:游戏”没有意义。JSON 中的所有组都处于同一级别。

这将是您的模型:

struct SearchData: Decodable  {
var success: Bool
var server_response_time: Int
var data: [SearchDataType]
}

//组名和组数组。

struct SearchDataType: Decodable   {
let group: String
let data: [SearchDataForGroup]
}

// 其中 group = 任何组(“电影”、“电视”、“游戏”等)

struct SearchDataForGroup: Decodable {
let title: String
let year: String
}

如果您想使用可解码来调用您的组的名称:

在顶层声明一个变量:

let allGroupNames = [data] = []

然后在您的解码函数中,您可以从组中提取所有组名,如下所示:

let mygroups = try decoder.decode(SearchData.self, from: data)

对于 mygroups.data 中的 groupValue{

self.all groupNames = groupValue.group
print(groupNames)

}

如果您打算从那里创建一个包含您可以使用的部分的 tableView:

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return allGroupNames[section].group
}

不确定这是否是您的意图,但希望这可以帮助您入门。

于 2019-10-24T17:23:21.697 回答