【问题标题】:Swift iOS how to handle JSON nested array in object class?Swift iOS 如何处理对象类中的 JSON 嵌套数组?
【发布时间】:2022-01-24 05:32:20
【问题描述】:

我想为特定类型中所有可用尺寸的咖啡创建一个 Swift TableView。有了这个 JSON 树,你如何构造类来为特定类型的大小创建一个数组?

JSON 树的结构如下:

{
 "_id": "60ba1ab72e35f2d9c786c610",
 "types": [
   {
     "_id": "60ba1a062e35f2d9c786c56d",
     "name": "Ristretto",
     "sizes": [
       "60ba18d13ca8c43196b5f606",
       "60ba3368c45ecee5d77a016b"
     ],
     "extras": [
       "60ba197c2e35f2d9c786c525"
     ]
   },
   {
     "_id": "60be1db3c45ecee5d77ad890",
     "name": "Espresso",
     "sizes": [
       "60ba3368c45ecee5d77a016b",
       "60ba33dbc45ecee5d77a01f8"
     ],
     "extras": [
       "60ba34a0c45ecee5d77a0263"
     ]
   },
   {
     "_id": "60be1eabc45ecee5d77ad960",
     "name": "Cappuccino",
     "sizes": [
       "60ba18d13ca8c43196b5f606",
       "60ba3368c45ecee5d77a016b",
       "60ba33dbc45ecee5d77a01f8"
     ],
     "extras": [
       "60ba197c2e35f2d9c786c525",
       "60ba34a0c45ecee5d77a0263"
     ]
   }
 ],
 "sizes": [
   {
     "_id": "60ba18d13ca8c43196b5f606",
     "name": "Large",
     "__v": 0
   },
   {
     "_id": "60ba3368c45ecee5d77a016b",
     "name": "Venti"
   },
   {
     "_id": "60ba33dbc45ecee5d77a01f8",
     "name": "Tall"
   }
 ],
 "extras": [
   {
     "_id": "60ba197c2e35f2d9c786c525",
     "name": "Select the amount of sugar",
     "subselections": [
       {
         "_id": "60ba194dfdd5e192e14eaa75",
         "name": "A lot"
       },
       {
         "_id": "60ba195407e1dc8a4e33b5e5",
         "name": "Normal"
       }
     ]
   },
   {
     "_id": "60ba34a0c45ecee5d77a0263",
     "name": "Select type of milk",
     "subselections": [
       {
         "_id": "611a1adeff35e4db9df19667",
         "name": "Soy"
       },
       {
         "_id": "60ba348d8c75424ac5ed259e",
         "name": "Oat"
       },
       {
         "_id": "60ba349a869d7a04642b41f4",
         "name": "Cow"
       }
     ]
   }
 ]
}

我的课程:(我目前可以加载带有咖啡尺寸的 TableView,但不能加载特定类型的尺寸)

import Foundation
import UIKit

class Types: Codable {
    let types: [CoffeeType]
    
    init(types: [CoffeeType]) {
        self.types = types
    }
}

class Sizes: Codable {
    let sizes: [CoffeeType]
    
    init(sizes: [CoffeeType]) {
        self.sizes = sizes
    }
}

class CoffeeType: Codable {
    let _id: String
    let name: String
    
    init(_id: String, name: String) {
        self._id = _id
        self.name = name
        
    }
}

应用程序的结构如下: HomeViewController 是一个 TableView 类型。当您单击一个类型时,您将转换到 SelectSizeViewController,我已经通过 segue 为其分配了一个类型。在 SelectSizeViewController 上,我想显示特定尺寸的列表。

【问题讨论】:

  • 你可以使用 tableview 部分对吗?如果你愿意,你可以在里面使用tableviews(这是一种hack)。根据我的理解,我要说的是,您可以使用部分来表示您再次拥有一系列大小的类型。在该单元格内填充一个子表视图,您可以在其中显示类型吗?
  • @Jok3r,子 TableView 或显示特定类型大小的单独 TableView。例如,对于 Cappuccino 类型,表格显示:“60ba18d13ca8c43196b5f606”、“60ba3368c45ecee5d77a016b”、“60ba33dbc45ecee5d77a01f8”。
  • 我们需要在单个表格视图中显示两者吗?否则我们可以做的一件事是,当您单击一个类型单元格时,它将重定向到该单元格中带有新表格视图的新视图控制器可以显示尺寸。当您执行 segue 时,您也可以传递数据,如果您想在单个 tableview 中显示所有内容,那么您必须在单元格内使用子 tablview .. 根据类型数组计数,您也可以设置高度,单独的 tableview 会更好
  • @Jok3r,最好使用单独的 TableView。您将如何设置 CoffeeType 类以包含大小数组?

标签: ios arrays json swift


【解决方案1】:

使用QuickType 获取模型,这很有帮助。您将轻松获得模型(建议)。我认为您使用了错误的模型。

如果你的 Base 模型结构是正确的,它应该是这样的

struct Coffie: Codable {
let id: String
let types: [TypeElement]
let sizes: [Size]
let extras: [Extra]

enum CodingKeys: String, CodingKey {
    case id
    case types, sizes, extras
}
}

您可以从这里获得类型和大小以及对应的 id,您可以从大小数组中过滤大小值

【讨论】:

  • QuickType 很棒,正是我需要的!
  • 你能不能接受我的回答,如果这对你有帮助:) 那太好了
  • 如何过滤 TableView 的大小?
  • 它不是关于过滤tableview,用id过滤数组然后你会得到值
猜你喜欢
  • 2021-12-10
相关资源
最近更新 更多