如果 bool key 为 false,则消除整行

Eliminate the entire row if bool key is false

我有以下回复

"timeslots" : [
{
  "date" : "2019-09-10",
  "slots" : [
    {
      "end" : "10:30:00",
      "available" : false,
      "start" : "09:00:00",
      "timeslot_pk" : 78
    },
    {
      "end" : "13:00:00",
      "available" : false,
      "start" : "11:00:00",
      "timeslot_pk" : 79
    },
    {
      "end" : "16:00:00",
      "available" : false,
      "start" : "14:00:00",
      "timeslot_pk" : 80
    },
    {
      "end" : "18:30:00",
      "available" : true,
      "start" : "16:30:00",
      "timeslot_pk" : 81
    },
    {
      "end" : "21:00:00",
      "available" : true,
      "start" : "19:00:00",
      "timeslot_pk" : 82
    }
  ],

我想删除包含 "available" 的槽值:false 并加载仅包含可用的 tableview 单元格:true

以下是API调用

if let slotArray = json["timeslots"][self.dayIndex ?? 0]["slots"].array{
                if !slotArray.isEmpty || slotArray != [] {
                    for slotJSON in slotArray {
                        let slot = Slots.parseSlots(slotJSON: slotJSON)
                        self.slots.append(slot)
                        self.tableView.reloadData()

                    }
                }
                else {
                    self.view.makeToast("No Slots Found!", duration: 3.0, position: .bottom)
                }

self.slots 上使用 filter(_:) 得到所有 slots 其中 available = true,

for slotJSON in slotArray {
    let slot = Slots.parseSlots(slotJSON: slotJSON)
    self.slots.append(slot)
}

self.slots = self.slots.filter({ [=10=].available })
self.tableView.reloadData()

仅在解析和过滤所有 slots 后才重新加载 tableView。在每次 slot 解析后重新加载 tableView 将导致不必要的开销。

尝试

struct Root: Codable {
    let end: String
    let available: Bool
    let start: String
    let timeslotPk: Int
}   

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase 
let value =  json["timeslots"][self.dayIndex ?? 0]["slots"]
let data = try!  value.rawData()
let res = try! decoder.decode([Root].self, from:data)
let filtered = res.filter { [=10=].available }
print(filtered)

在创建 Slots 个实例之前过滤数组

if let slotArray = json["timeslots"][self.dayIndex ?? 0]["slots"].array {
   let filteredSlots = slotArray.filter{[=10=]["available"].bool == true } 
   self.slots = filteredSlots.map { Slots.parseSlots(slotJSON: [=10=]) }
   self.tableView.reloadData()
} else {
   self.view.makeToast("No Slots Found!", duration: 3.0, position: .bottom)
}

考虑放弃 SwiftyJSON 以支持 Codable