【问题标题】:Issue filtering array using criteria | Swift 5使用标准问题过滤数组 |斯威夫特 5
【发布时间】:2021-11-18 05:21:57
【问题描述】:

如何过滤以下 JSON 数组以排除值 type = quiet 以仅启动 test.testid 输入其他所有内容的视图控制器。

目前正在做以下事情:

do {
  let nav = try JSONDecoder().decode([TestStruct].self, from: data)

  self.viewControllers = nav.map { test -> UIViewController in
    let selected = UIImage(named: "Tab4_Large")!
    let normal = UIImage(named: "Tab4_Large")!
    let controller = storyboard!.instantiateViewController(withIdentifier: String(test.testid))
    controller.view.backgroundColor = UIColor.white
    controller.floatingTabItem = FloatingTabItem(selectedImage: selected, normalImage: normal)

return controller
}

JSON 解码结构:

struct TestStruct: Decodable {
    let testname: String
    let type: String
    let testid: Int
}

需要排除 type = "quiet",但在 nav.map 中包含其余部分

JSON 示例:

[
  {
    "testname": "Teller",
    "type": "load",
    "testid": 2
  },
  {
    "testname": "Manager",
    "type": "load",
    "testid": 8
  },
  {
    "testname": "Tester",
    "type": "quiet",
    "testid": 8
  }
]

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    为了你想要达到的结果。首先需要过滤没有type = quiet的值的数组。

    let filteredArray = nav.filter { $0.type != "quiet" }
    

    然后您可以使用compactMap 来获得您想要的结果。我不确定instantiateViewController 部分是否会按照您想要的方式工作。

    但我添加了一个我在Playground 中尝试过的简单示例:

    var stringData = "[{\"testname\":\"Teller\",\"type\":\"load\",\"testid\":2},{\"testname\":\"Manager\",\"type\":\"load\",\"testid\":8},{\"testname\":\"Tester\",\"type\":\"quiet\",\"testid\":8}]"
    
    let data = stringData.data(using: .utf8)!
    
    struct TestStruct: Decodable {
        let testname: String
        let type: String
        let testid: Int
     }
    
    struct ViewControl {
        let id: Int
    }
    
    do {
        let nav = try JSONDecoder().decode([TestStruct].self, from: data)
        let filteredArray = nav.filter { $0.type != "quiet" }
        print(filteredArray)
        let controllers = filteredArray.compactMap({ test -> ViewControl in
                let viewControl = ViewControl(id: test.testid)
                return viewControl
            })
    
        print(controllers)
     } catch let error as NSError {
        print(error)
    }
    

    【讨论】:

    • 这是正确的想法。一次做一件事:首先从 JSON 中读取数组,然后过滤它以删除不需要的条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2017-07-22
    • 2017-03-24
    • 2015-08-02
    • 2020-07-31
    相关资源
    最近更新 更多