首页 > 解决方案 > 使用标准问题过滤数组 | 斯威夫特 5

问题描述

如何过滤以下 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
  }
]

标签: arraysswift

解决方案


对于您想要达到的结果。首先需要过滤没有值的数组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)
}

推荐阅读